当前位置: 首页 > 面试题库 >

如果main方法完成执行,那么任何长时间运行的线程会怎样?

席弘图
2023-03-14
问题内容

因为main()在线程上运行。并且一旦main()完成,主线程应停止。因此,如果main()调用了一个长时间运行的线程,即使main()完成了所有任务后该线程仍未完成。由于main()返回了,其他线程会终止吗?我觉得不是。但为什么?

public static void main(String[] s){    
    new LongRunningThread().start();
}

问题答案:

当不再有非守护程序线程时,该进程将终止,并在必要时终止所有守护程序线程。但是,如果 确实 有任何非守护线程,则这些线程将阻止进程终止。

来自Thread.setDaemon

将此线程标记为守护程序线程或用户线程。当所有正在运行的线程都是守护程序线程时,Java虚拟机将退出。

必须在启动线程之前调用此方法。

从JLS的12.8节开始:

程序终止其所有活动并在发生以下两种情况之一时退出:

  • 不是守护程序线程的所有线程都会终止。

  • 某些线程调用类Runtime或System类的exit方法,并且安全管理器不禁止退出操作。



 类似资料:
  • 问题内容: 我有一个python celery-redis队列处理一次上传和下载值得一次演出和大量演出的数据。 很少有上传内容需要花费几个小时的时间。但是,一旦完成了这样的任务,我就目睹了这种奇怪的芹菜行为:芹菜调度程序通过将其再次发送给工作人员来重新运行刚刚完成的任务(我正在运行一个工作人员),并且它在同一时间发生了2次任务! 有人可以帮助我知道为什么会发生这种情况以及如何预防吗? 这些任务肯定

  • 我有一个压缩图像的任务,它在图像中使用了许多循环: 我在普通线程中运行此方法,如下所示: 或者在后台工作线程中运行 问题是:这种方法有时会出错,在接收无效输入时会导致无限循环。在这种情况下,它将永远运行,并损害CPU,即使当设备的屏幕关闭时,这会增加设备的温度(如果我使用工作线程,它还会阻止等待队列中的其他任务)。 我想我需要设置一个超时来终止长时间运行的任务。在正常Java线程中实现这一点的最佳

  • 问题内容: 我有一个方法,可以写入数据库。要求是确保经过一定时间后该方法不执行。如果在此之前返回,则什么也不做。 我能想到的一种基本方法就是这样做。 这种方法的一个问题是,即使方法在最大总执行时间之前返回,程序也会暂停以等待经过的时间。 我该如何做得更好(或更正确)?如果使用,我们如何找出执行该方法的对象? 问题答案: 您可以通过将工作发送给执行者来做到这一点:

  • 我正在做一个项目,我有两个线程一起运行。这个项目是一个模拟银行,本质上,我们有一个存款线程和一个取款线程。我有一个存款线程经常运行的问题,导致银行账户的余额上升。(我希望现实生活中也有这个问题。)如何减少一个线程运行的时间? 这是我的主要课程: 以下是取款和存款线程类: 最后她是交易类: 我试图让线程在达到锁定条件之前进入睡眠状态,但不幸的是,它不起作用。

  • 需要检测两个对象的状态,并且任务需要实时。run方法使用while(flag)循环通过更改flag=false来结束线程的生命周期。线程通常需要运行40分钟或更长时间。使用线程池将导致核心线程池耗尽,而任务将进入队列,因为每个线程将运行40分钟,每个线程的执行时间非常长且不固定,因此必须有许多线程无法及时响应。 我尝试使用新线程(runnable)。Start()而不是使用线程池ThreadPoo

  • 我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,