簡介
一般情況下,執行緒執行完成后就會結束,但有的時候我們可能需要在它正常執行完成前就停止它,可以考慮使用以下三種方法:
-
使用Thread中的stop方法,這個方法已經被標為已廢棄,不推薦使用,原因是stop方法會立即終止執行緒并釋放持有的鎖,在多執行緒的情況下可能會導致資料不一致的問題,
-
自定義一個標志,通過修改這個標志的值來讓執行緒判斷是否需要退出,
-
使用執行緒中斷機制,
后面兩種方法有點類似,都是通過給執行緒發一個通知,然后讓執行緒去判斷是否可以結束,而不是像stop方法那樣暴力的終止執行緒,下面介紹下后兩種方法的使用和區別,
使用自定義標志停止執行緒
這里定義了一個變數flag,主執行緒會在3秒后將flag設定為false,當flag為false的時候,run方法里面的回圈就會結束,執行緒也就停止了,
public class MyThread extends Thread{
volatile boolean flag = true;
@Override
public void run() {
while (flag){
System.out.println("do something...");
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(3000);
myThread.flag = false;
}
}
使用執行緒中斷機制停止執行緒
執行緒中斷有關的三個方法:
- interrupt(),中斷執行緒,
- isInterrupted(),判斷執行緒是否被中斷,
- interrupted,Thread類的靜態方法,判斷執行緒是否被中斷,并清除中斷狀態,
這種方式與前面那種方式很類似,只是由判斷flag變為判斷執行緒是否被中斷,
public class MyThread extends Thread{
@Override
public void run() {
while (!isInterrupted()){
System.out.println("do something...");
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(3000);
myThread.interrupt();
}
}
自定義標志和執行緒中斷機制的區別
前面介紹的兩種方式使用起來非常的類似,但是中斷機制要更強,因為當回圈體內出現了Thread.sleep()或者wait()這樣的操作時,自定義標志的方式就只能等阻塞結束,而這兩個方法是可以回應中斷的,
1.主執行緒在3秒后更改flag狀態,但是執行緒還處于sleep()阻塞中,需要等到sleep()時間結束也就是10秒后執行緒才停止,
public class MyThread extends Thread{
volatile boolean flag = true;
@Override
public void run() {
while (flag){
try {
Thread.sleep(10000);
}catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println("do something...");
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(3000);
myThread.flag = false;
}
}
2.處于sleep()阻塞中的執行緒如果被中斷就會拋出InterruptedException例外,此時它會清除中斷標記,所以需要捕獲該例外,并在例外處理中再次設定中斷標記,
public class MyThread extends Thread{
@Override
public void run() {
while (!isInterrupted()){
try {
Thread.sleep(10000);
}catch (InterruptedException ex){
//重新設定中斷標記
interrupt();
}
System.out.println("do something...");
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(3000);
myThread.interrupt();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266576.html
標籤:Java
下一篇:JVM記憶體模型(運行時資料區)
