Thinking in java 第21章 并发 21.2.8 后台线程 Executors无法执行守护线程
程序员文章站
2022-05-07 08:44:33
...
什么是后台线程(守护线程)
为其他线程提供服务的线程,当所有其他线程结束的时候,后台线程也就结束了,只要有一个线程没有结束,那么后台线程就一直执行下去。
但是我们一般做多线程都是使用线程池,比如:
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
MyThread m1 = new MyThread();
m1.setDaemon(true);
service.execute(m1);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public class MyThread extends Thread {
@Override
public void run() {
super.run();
while(true)
System.out.println(111);
}
}
但是结果,确实守护线程并没有起到任何作用,m1这个线程会一直运行下去。
但是在Thinking in java种,作者给出了方案:
public class DaemonThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
}
public class DaemonFromFactory implements Runnable {
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
System.out.println(Thread.currentThread() + " " + this);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool(new DaemonThreadFactory());
IntStream.range(0,10).forEach(i->service.execute( new DaemonFromFactory()));
System.out.println("所有后台进程开启");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end");
}
}
通过传入一个ThreadFactory来对传入的Runnable进行加工。
上一篇: oracle 触发器before和after数据区别
下一篇: Nginx的反向代理配置实例