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

Java-程序结束时自动停止线程

饶德元
2023-03-14
问题内容

看一下这段代码

public class ThreadTest {

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    //some code here
                }
            }
        }).start();

        System.out.println("End of main");
    }

}

通常,main到达的结尾时,程序会终止。但是在此示例中,程序将打印“ main of
End”,然后继续运行,因为线程仍在运行。有没有一种方法可以使线程在结束时 自动 停止,而无需使用类似的东西while(isRunning)


问题答案:

您正在创建的线程是独立的,并且不依赖于主线程终止。您可以使用Daemon线程。
当没有其他线程在运行时,守护进程线程将由JVM终止,它也包括一个执行主线程。

public static void main(String[] args) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                System.out.println("Daemon thread");
            }
        }
    });
    t.setDaemon(true);
    t.start();

    System.out.println("End of main");
}


 类似资料:
  • 问题内容: 如果我在无限循环中有一个线程,有没有办法在主程序结束时(例如,当我按 +时 )终止它? 问题答案: 检查这个问题。正确答案对如何以正确的方式终止线程有很好的解释: 是否有任何方法可以杀死Python中的线程? 要使线程在键盘中断信号(ctrl + c)上停止,您可以在退出之前捕获异常“ KeyboardInterrupt”并进行清除。像这样: 这样,您可以控制程序突然终止时的处理方式。

  • 程序从另一个类调用一个方法,这有助于更改程序的停止条件。它平均调用该方法3-8次,并且从未达到停止条件,但是它停止了。 示例类如下: 只限于在每个当的条件为false时,use示例类的当循环才会停止。这意味着: 它应该输出它经历了多少个同时循环以及每个循环的值。最终输出a1到e1的相同值。

  • 我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,可以运行用户想要的时间,但最终会在用户发出停止命令时停止。然而,如果其中一个线程突然终止(例如,由于运行时异常),我想停止另一个线程。 现在,这两个线程都执行一个(因此,当我说“stop a thread”时,我的意思是对实例调用一个stop()方法),我想的是避免使用线程(thread类),并使用interface,然后将这两个Runn

  • 这个问题可以更好地表述为:如何在不阻塞的情况下检测InputStream中的EOF 我有一个java程序,它可以直接从System.in中获取输入(不使用扫描器),我也可以像任何程序一样直接将输入管道输入到java程序中。但是,当我将输入管道输入到程序中时,程序继续运行。这个想法是,如果输入被管道输入,就停止程序,但如果我们在等待用户输入,就保持程序运行。 编辑:无论出于什么原因,我花了大约2个小

  • 问题内容: 我读了这句话: 主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止。 是真的吗 我也知道“即使主线程死程序继续运行”。 据我了解:启动程序时,JVM创建一个线程来运行您的程序。JVM创建一个用于运行程序的用户线程。该线程称为主线程。该类的main方法是从主线程调用的。如果程序从主线程中产生新线程,它将停止直到最后一个线程死亡。 哪一个是对的? 问题答案: 当所有非守护程序线程

  • 问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT