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