看见这两个,表示如何结束线程了, 即终止一个应用。
1》 non-daemon线程结束----强制daemon干活线程结束,不管它执行到哪里。
2》non-daemon线程结束---non-daemon干活线程执行完,自己结束。
3》non-daemon Excutor 管理所有的干活线程,也许是最好的一种方式结束所有线程。
(1) TimeUnit.SECONDS.sleep(10);
exec.shutdown();
mai()执行到sleep(10)-----non-daemon干活线程执行-----main()自然醒------main()执行exec.shutdown();----等待子当前干活线程执行完,结束应用
(2)exec.shutdown();
main()---执行到shutdown时-----继续执行子干活线程-----全部执行完----main()结束一个应用。
1、 daemon 线程(后台线程):jvm自己用,如一个线程自动执行垃圾收集。
A daemon thread is ordinarily a thread used by the virtual machine itself, such as a thread that performs garbage collection.
2、non-daemon 线程(前台线程):负责和用户打交道,如一个应用首先运行的是main()线程,然后main线程启动我们的写的方法。
The application, however, can mark any threads it creates as daemon threads.The initial thread of an application--the one that begins at main()--is a non-daemon thread.shezh
二、例子图形说明
1、main():non-Daemon
1》如果不设Daemon,main()在代码执行完后,执行干活线程。例子是 while(true) 死循环,不中断,也出不来,子干活线程一直处于执行中。
2》如果不设Daemon,main()在执行到几条语句后---让出cpu,干活线程执行,出不来,因为干活线程 while(true) 死循环。
2、干活线程设置Daemon,下面 有10个 干活线程,可以设置
睡觉时间 | 输出结果 | 干活线程执行数 |
TimeUnit.MILLISECONDS.sleep(10) | All daemons started | 没有一个干活线程执行 main线程自然醒, 占cpu,一个应用结束 |
TimeUnit.MILLISECONDS.sleep(100) | Thread[Thread-0,5,main] concurrency.SimpleDaemons@bb11f9 Thread[Thread-1,5,main] concurrency.SimpleDaemons@14e97b9 Thread[Thread-6,5,main] concurrency.SimpleDaemons@eb3e0a Thread[Thread-2,5,main] concurrency.SimpleDaemons@18b7e50 Thread[Thread-4,5,main] concurrency.SimpleDaemons@24d19d | 5个干活线程执行 main线程自然醒, 占cpu,一个应用结束 |
有时干活线程数执行不一样,有多有少,可能根据机器的进程执行和本应用的线程优先级有关。
1、设置daemon.setDaemon(true),main()线程sleep 阻塞,让出cpu,让子干活线程执行一会儿。
package concurrency; import java.util.concurrent.TimeUnit; import static net.mindview.util.Print.*; public class SimpleDaemons implements Runnable { public void run() { try { while (true) { TimeUnit.MILLISECONDS.sleep(100); print(Thread.currentThread() + " " + this); } } catch (InterruptedException e) { print("sleep() interrupted"); } } public static void main(String[] args) throws Exception { for (int i = 0; i < 10; i++) { Thread daemon = new Thread(new SimpleDaemons()); daemon.setDaemon(true); // Must call before start() daemon.start(); } print("All daemons started"); TimeUnit.MILLISECONDS.sleep(100); } } |