停止執行緒的三種方法
阿新 • • 發佈:2019-02-08
在Java中有以下3種方法可以終止正在執行的執行緒:
1. 拋異常法;
2. 使用stop方法強行終止執行緒
3. 使用interrupt方法中斷執行緒
下面分別對它們進行介紹:
一、拋異常法
拋異常法:顧名思義就是通過丟擲一個異常,然後再捕獲異常,從而跳過後面要繼續執行的語句,達到終止執行緒的目的。使用拋異常法首先要判斷該執行緒是否是停止狀態,只有是停止狀態才拋異常。
下面是具體示例:
package com.vhqimk.thread;
/*
* 測試通過拋異常終止執行緒的情況
*/
public class Test {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
myThread.sleep(2000);
myThread.interrupt();
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
}
}
class MyThread extends Thread {
public void run() {
super.run();
try {
for (int i = 0; i < 500000; i++) {
if (this.interrupted()) {
System.out.println("已經是停止狀態了!我要退出了!");
throw new InterruptedException();
}
System.out.println("i=" + (i + 1));
}
System.out.println("我在for下面");
} catch (InterruptedException e) {
System.out.println("進MyThread類run方法中的catch了!");
e.printStackTrace();
}
System.out.println("end!");
}
}
執行結果如圖 1-7所示
圖 1-7 執行結果
二、使用stop暴力停止
使用stop()方法停止執行緒則是非常暴力的,而且stop是作廢過期的方法,因此不推薦使用這種方法。
下面是程式碼示例
package com.vhqimk.thread;
/*
* 測試stop方法終止執行緒的情況
*/
public class Test {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
myThread.sleep(8000);
myThread.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThread extends Thread {
private int i = 0;
public void run() {
super.run();
try {
while (true) {
i++;
System.out.println("i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end!");
}
}
執行結果如圖 1-8所示
圖 1-8 執行緒被暴力停止(stop)執行後圖標呈灰色
三、使用interrupt方法中斷執行緒
將方法interrupt()與return結合使用也能實現停止執行緒的效果,下面是具體示例:
package com.vhqimk.thread;
/*
* 測試interrupt方法終止執行緒的情況
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(8000);
myThread.interrupt();
}
}
class MyThread extends Thread {
private int i = 0;
public void run() {
while (true) {
if (this.isInterrupted()) {
System.out.println("停止了!");
return;
}
System.out.println("timer=" + System.currentTimeMillis());
}
}
}
執行結果如圖 1-9所示
圖 1-9 成功停止執行
總結:停止執行緒有三種方法,建議使用“拋異常”法來實現執行緒的停止,因為在catch塊中可以對異常資訊進行相關的處理,而且使用異常流能更好、更方便地控制程式的執行流程,不會像第三種方法那樣出現多個return,造成汙染,也不建議用stop方法強行終止執行緒,因為使用它可能產生不可預料的結果。
(正在學習高洪巖先生著的《java多執行緒程式設計核心技術》,例子摘自此書,有興趣的可以查閱此書)