jvm 有 Daemon,non-daemon 两种线程

来源:互联网 发布:做淘宝必须有团队 编辑:程序博客网 时间:2024/06/10 23:07

看见这两个,表示如何结束线程了, 即终止一个应用。

 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()结束一个应用。

一、jvm只有两种线程:

    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);    
}
}