Java 終止執行緒方法
終止執行緒的三種方法
有三種方法可以使終止執行緒。
1. 使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。
2. 使用stop方法強行終止執行緒(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷執行緒。
1. 使用退出標誌終止執行緒
當run方法執行完後,執行緒就會退出。但有時run方法是永遠不會結束的。如在服務端程式中使用執行緒進行監聽客戶端請求,或是其他的需要迴圈處理的任務。在這種情況下,一般是將這些任務放在一個迴圈中,如while迴圈。如果想讓迴圈永遠執行下去,可以使用while(true){……}來處理。但要想使while迴圈在某一特定條件下退出,最直接的方法就是設一個boolean型別的標誌,並通過設定這個標誌為true或false來控制while迴圈是否退出。下面給出了一個利用退出標誌終止執行緒的例子。
package chapter2;
public class ThreadFlag extends Thread
{
public volatile boolean exit = false;
public void run()
{
while (!exit);
}
public static void main(String[] args) throws Exception
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主執行緒延遲5秒
thread.exit = true; // 終止執行緒thread
thread.join();
System.out.println("執行緒退出!");
}
}
在上面程式碼中定義了一個退出標誌exit,當exit為true時,while迴圈退出,exit的預設值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個執行緒來修改exit的值,
2. 使用stop方法終止執行緒
使用stop方法可以強行終止正在執行或掛起的執行緒。我們可以使用如下的程式碼來終止執行緒:
thread.stop();
雖然使用上面的程式碼可以終止執行緒,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止執行緒。
3. 使用interrupt方法終止執行緒
使用interrupt方法來終端執行緒可分為兩種情況:
(1)執行緒處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷執行緒是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將丟擲一個InterruptedException例外,而在第二種情況下執行緒將直接退出。下面的程式碼演示了在第一種情況下使用interrupt方法。
package chapter2;
public class ThreadInterrupt extends Thread
{
public void run()
{
try
{
sleep(50000); // 延遲50秒
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception
{
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷執行緒!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("執行緒已經退出!");
}
}
上面程式碼的執行結果如下:
在50秒之內按任意鍵中斷執行緒!
sleep interrupted
執行緒已經退出!
在呼叫interrupt方法後, sleep方法丟擲異常,然後輸出錯誤資訊:sleep interrupted.
注意:在Thread類中有兩個方法可以判斷執行緒是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他執行緒是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。
文章轉載自網管之家:http://www.bitscn.com/pdb/java/200904/161228_3.html
有三種方法可以使終止執行緒。
1. 使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。
2. 使用stop方法強行終止執行緒(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷執行緒。
1. 使用退出標誌終止執行緒
當run方法執行完後,執行緒就會退出。但有時run方法是永遠不會結束的。如在服務端程式中使用執行緒進行監聽客戶端請求,或是其他的需要迴圈處理的任務。在這種情況下,一般是將這些任務放在一個迴圈中,如while迴圈。如果想讓迴圈永遠執行下去,可以使用while(true){……}來處理。但要想使while迴圈在某一特定條件下退出,最直接的方法就是設一個boolean型別的標誌,並通過設定這個標誌為true或false來控制while迴圈是否退出。下面給出了一個利用退出標誌終止執行緒的例子。
package chapter2;
public class ThreadFlag extends Thread
{
public volatile boolean exit = false;
public void run()
{
while (!exit);
}
public static void main(String[] args) throws Exception
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主執行緒延遲5秒
thread.exit = true; // 終止執行緒thread
thread.join();
System.out.println("執行緒退出!");
}
}
在上面程式碼中定義了一個退出標誌exit,當exit為true時,while迴圈退出,exit的預設值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個執行緒來修改exit的值,
2. 使用stop方法終止執行緒
使用stop方法可以強行終止正在執行或掛起的執行緒。我們可以使用如下的程式碼來終止執行緒:
thread.stop();
雖然使用上面的程式碼可以終止執行緒,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止執行緒。
3. 使用interrupt方法終止執行緒
使用interrupt方法來終端執行緒可分為兩種情況:
(1)執行緒處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷執行緒是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將丟擲一個InterruptedException例外,而在第二種情況下執行緒將直接退出。下面的程式碼演示了在第一種情況下使用interrupt方法。
package chapter2;
public class ThreadInterrupt extends Thread
{
public void run()
{
try
{
sleep(50000); // 延遲50秒
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception
{
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷執行緒!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("執行緒已經退出!");
}
}
上面程式碼的執行結果如下:
在50秒之內按任意鍵中斷執行緒!
sleep interrupted
執行緒已經退出!
在呼叫interrupt方法後, sleep方法丟擲異常,然後輸出錯誤資訊:sleep interrupted.
注意:在Thread類中有兩個方法可以判斷執行緒是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他執行緒是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。
文章轉載自網管之家:http://www.bitscn.com/pdb/java/200904/161228_3.html
相關文章
- 終止java執行緒的2種方法Java執行緒
- Java之 join 等待執行緒終止Java執行緒
- Thread執行緒終止interruptthread執行緒
- 執行緒的基本操作:新建和終止執行緒執行緒
- Thinking in Java---如何正確的終止子執行緒ThinkingJava執行緒
- Java實現終止執行緒池中正在執行的定時任務Java執行緒
- 併發程式設計——如何終止執行緒程式設計執行緒
- 如何"優雅"地終止一個執行緒?執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒
- Java 執行緒建立與常用方法Java執行緒
- subprocess.Popen 如何提前終止程式執行
- Java多執行緒-執行緒中止Java執行緒
- Java 執行緒池獲取池中所有執行緒列表的方法Java執行緒
- Java—執行緒的生命週期及執行緒控制方法詳解Java執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- 還不知道如何在java中終止一個執行緒?快來,一文給你揭秘Java執行緒
- 終止expdp正在執行中的匯出任務
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java多執行緒9:執行緒池Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【JAVA併發第二篇】Java執行緒的建立與執行,執行緒狀態與常用方法Java執行緒
- 多執行緒(五)---執行緒的Yield方法執行緒
- Java多執行緒【三種實現方法】Java執行緒
- Java建立多執行緒的一種方法Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 執行緒同步方法執行緒
- java多執行緒Java執行緒
- Java與執行緒Java執行緒