java将线程分为user线程和daemon线程两种。通常daemon线程用来为user线程提供某些服务。程序的main()方法线程是一个user进程。user进程创建的进程为user进程。当所有的user线程结束后,jvm才会结束。
通过在一个线程对象上调用setdaemon(true),可以将user线程创建的线程明确地设置成daemon线程。例如,时钟处理线程、idle线程、垃圾回收线程、屏幕更新线程等,都是daemon线程。通常新创建的线程会从创建它的进程哪里继承daemon状态,除非明确地在线程对象上调用setdaemon方法来改变daemon状态。
需要注意的是,setdaemon()方法必须在调用线程的start()方法之前调用。一旦一个线程开始执行(如,调用了start()方法),它的daemon状态不能再修改。通过方法isdaemon()可以知道一个线程是否daemon线程。
通过执行下面的代码,可以很清楚地说明daemon的作用。当设置线程t为daemon线程时,只要user线程(main线程)一结束,程序立即退出,也就是说daemon线程没有时间从10数到1。但是,如果将线程t设成非daemon,即user线程,则该线程可以完成自己的工作(从10数到1)。
<a href="http://my.oschina.net/itblog/blog/265460#">?</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code>import</code> <code>static</code> <code>java.util.concurrent.timeunit.*;</code>
<code>public</code> <code>class</code> <code>daemontest {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) </code><code>throws</code> <code>interruptedexception {</code>
<code> </code><code>runnable r = </code><code>new</code> <code>runnable() {</code>
<code> </code><code>public</code> <code>void</code> <code>run() {</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>time = </code><code>10</code><code>; time > </code><code>0</code><code>; --time) {</code>
<code> </code><code>system.out.println(</code><code>"time #"</code> <code>+ time);</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>seconds.sleep(</code><code>2</code><code>);</code>
<code> </code><code>} </code><code>catch</code> <code>(interruptedexception e) {</code>
<code> </code><code>e.printstacktrace();</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>};</code>
<code> </code>
<code> </code><code>thread t = </code><code>new</code> <code>thread(r);</code>
<code> </code><code>t.setdaemon(</code><code>true</code><code>); </code><code>// try to set this to "false" and see what happens</code>
<code> </code><code>t.start();</code>
<code> </code><code>system.out.println(</code><code>"main thread waiting..."</code><code>);</code>
<code> </code><code>seconds.sleep(</code><code>6</code><code>);</code>
<code> </code><code>system.out.println(</code><code>"main thread exited."</code><code>);</code>
<code> </code><code>}</code>
<code>}</code>
t为daemon线程的输出:
main thread waiting...
time #10
time #9
time #8
main thread exited.
time #7
t为user线程的输出:
time #6
time #5
time #4
time #3
time #2
time #1