一個多個線程在執行的java程式,隻有當其全部的線程執行結束時(更具體的說,是所有非守護線程結束或者某個線程調用system.exit()方法的時候),它才會結束運作。有時,你需要為了終止程式而結束一個線程,或者當程式的使用者想要取消某個thread對象正在做的任務。
java提供中斷機制來通知線程表明我們想要結束它。中斷機制的特性是線程需要檢查是否被中斷,而且還可以決定是否響應結束的請求。是以,線程可以忽略中斷請求并且繼續運作。
在這個指南中, 我們将開發一個程式,它建立線程,然後在5秒之後,它會使用中斷機制來強制結束線程。
<b>準備</b>
指南中的例子是使用eclipse ide 來實作的。如果你使用eclipse 或者其他的ide,例如netbeans, 打開并建立一個新的java項目。
怎麼做呢<b>…</b>
按照這些步驟來實作下面的例子::
1. 建立一個名為primegenerator的類,擴充thread類。
<code>1</code>
<code>public</code> <code>class</code> <code>primegenerator</code><code>extends</code> <code>thread{</code>
2. 覆寫 run()方法,寫一個無限循環的while循環。在循環裡,我們将從1開始處理連續的數字。對于每個數字,如果它是質數,那麼,我們就把它寫入到操控台。
<code>@override</code>
<code>2</code>
<code>public</code> <code>void</code> <code>run() {</code>
<code>3</code>
<code> </code><code>long</code> <code>number=1l;</code>
<code>4</code>
<code> </code><code>while</code> <code>(</code><code>true</code><code>) {</code>
<code>5</code>
<code> </code><code>if</code> <code>(isprime(number)) {</code>
<code>6</code>
<code> </code><code>system.out.printf(</code><code>"number %d is prime"</code><code>,number);</code>
<code>7</code>
<code> </code><code>}</code>
3. 處理完一個數字, 調用isinterrupted()方法來檢查線程是否被中斷了。如果它傳回值為真,就寫一個資訊并結束線程的運作。
<code>if</code> <code>(isinterrupted()) {</code>
<code> </code><code>system.out.printf(</code><code>"the prime generator has been interrupted"</code><code>);</code>
<code> </code><code>return</code><code>;</code>
<code>}</code>
<code>number++;</code>
4. 實作isprime()方法. 它傳回 boolean 值表明接收到的數字是否是質數。
<code>01</code>
<code>private</code> <code>boolean</code> <code>isprime(</code><code>long</code> <code>number) {</code>
<code>02</code>
<code> </code><code>if</code> <code>(number <=</code><code>2</code><code>) {</code>
<code>03</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code>04</code>
<code> </code><code>}</code>
<code>05</code>
<code>06</code>
<code> </code><code>for</code> <code>(</code><code>long</code> <code>i=</code><code>2</code><code>; i<number; i++){</code>
<code>07</code>
<code> </code><code>if</code> <code>((number % i)==</code><code>0</code><code>) {</code>
<code>08</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code>09</code>
<code> </code><code>}</code>
<code>10</code>
<code>11</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code>12</code>
5. 現在, 實作一個名為main的類,包括實作main()方法來實作例子的mian類。
<code>public</code> <code>class</code> <code>main {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>
6. 建立并開始一個primegenerator類的對象。
<code>thread task=</code><code>new</code> <code>primegenerator();</code>
<code>task.start();</code>
7. 等待5秒,然後中斷 primegenerator 方法。
<code>try</code> <code>{</code>
<code> </code><code>thread.sleep(</code><code>5000</code><code>);</code>
<code>}</code><code>catch</code> <code>(interruptedexception e) {</code>
<code> </code><code>e.printstacktrace();</code>
<code>task.interrupt();</code>
8. 運作并檢視結果。
<b>它是如果工作的</b><b>…</b>
下面是以上例子的運作結果這截圖。我們可以發現 primegenerator 線程是如何檢測到它被中斷了然後寫了資訊并結束運作的。 請看截圖:

thread 類還有一個boolean類型的屬性來表明線程是否被中斷。當你調用線程的interrupt() 方法,就代表你把這個屬性設定為 true。 而isinterrupted() 方法僅傳回屬性值。
<b>更多</b><b>…</b>
thread 類還有其他可以檢查線程是否被中斷的方法。例如,這個靜态方法interrupted()能檢查正在運作的線程是否被中斷。
isinterrupted()和interrupted() 方法有着很重要的差別。
第一個不會改變interrupted屬性值,但是第二個會設定成false。
interrupted() 方法是一個靜态方法,建議使用isinterrupted()方法。
在之前提到的,線程是可以忽略中斷指令的,但是并這不是我們所期望的行為。