Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程相当于Python线程守护程序模式_Java_Multithreading - Fatal编程技术网

Java线程相当于Python线程守护程序模式

Java线程相当于Python线程守护程序模式,java,multithreading,Java,Multithreading,在python中,我可以将线程设置为守护进程,这意味着如果父线程死亡,子线程也会随之自动死亡 Java中是否有类似的语言 目前,我正在Java中启动一个类似这样的线程,但即使主线程退出,底层子线程也不会死机并挂起 executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { while (true) { //Sto

在python中,我可以将线程设置为守护进程,这意味着如果父线程死亡,子线程也会随之自动死亡

Java中是否有类似的语言

目前,我正在Java中启动一个类似这样的线程,但即使主线程退出,底层子线程也不会死机并挂起

         executor = Executors.newSingleThreadExecutor();
         executor.submit(() -> {
             while (true) {
                 //Stopwatch stopwatch = Stopwatch.createStarted();

                 String threadName = Thread.currentThread().getName();
                 System.out.println("Hello " + threadName);
                 try {
                     Thread.sleep(1*1000);
                 } catch (InterruptedException e) {
                     break;
                 }   

             }       
         });

当您与裸
线程进行交互时,您可以使用:

Thread thread = new Thread(new MyJob());
thread.setDaemon(true);

thread.start();
在您的示例中,有一个
ExecutorService
需要与
ThreadFactory
一起提供,它应该完成类似的工作-如下所示:

Executors.newSingleThreadExecutor(new ThreadFactory() {
    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setDaemon(true);

        return thread;
    }
});
我还建议使用
Guava
s
ThreadFactoryBuilder

Executors.newSingleThreadExecutor(
        new ThreadFactoryBuilder()
                .setDaemon(true)
                .build()
); 
它简化了最常见线程属性的设置,并允许链接多个线程工厂

更新


正如Slaw和Boris蜘蛛正确地注意到的,您已经提到了当父线程死亡时会导致杀死子线程的行为。Python和Java中都没有类似的东西。当所有其他非守护进程线程退出时,守护进程线程将被终止。

您检查过了吗?在Java中,守护进程线程和非守护进程线程之间的唯一区别是前者不会使JVM保持活动状态。守护进程线程不会因为启动它的线程已经死亡而死亡(当然,除非父线程死亡意味着不再有非守护进程线程在运行);在Java中也没有办法集中杀死
线程
,因此这样的事情无法实现。OP在Python中说,如果父线程死了,子线程就死了。@BoristheSpider我不认为Python中有这样的东西:)线程的父线程是产生它的进程,这正是我的观点。这个答案不仅是错误的,而且具有误导性。您对线程父级的评论当然不正确。在更改为使用new ThreadFactory()后,似乎不再调用my submit()。我遗漏了什么吗?@ealeon在线程工厂中,你应该将
Runnable
传递给
thread
构造函数(比如:
thread-thread=new-thread(r);
)我已经更新了代码