天天看點

轉 Java中User Thread和Daemon Thread的差別

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 &gt; </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