最近在系統回顧多線程這一部分的内容,對線程中斷方式這一部分相比之前有了不同的認識。整理一下,如有了解偏頗之處,還請各位大神不惜賜教。
在看高洪岩《Java多線程程式設計核心技術》的時候裡面講了很多種停止線程方式,其實仔細回想起來停止線程并沒有那麼複雜。總體整理下來就三種方式!1、正常退出;2、stop暴力停止(不再推薦使用);3、異常法;
1、正常退出
當線程中run()或者call()按照邏輯流程正常的執行結束了,線程也就自然停止了。
2、stop暴力停止
直接在程式中使用thread.stop(),線程會馬上停止,但是可能導緻資料不同步,或者資源得不到回收的問題而且stop已經标注為廢棄方法,是以使用一定要慎重。
3、interrupt()異常法。
小編以前的部落格寫過《【多線程】——停止線程的三種方式》其中講的是interrupt()和在沉睡中停止本質上講這兩種方式都是通過異常停止的,而且講的不是很全面,應該是隻要線程處于阻塞狀态配合interrupt()都能使線程停止,而且停止的方式都是通過抛異常。
interrupt()方法僅僅是在目前線程中打了一個停止的辨別将中斷标志修改為true,并沒有真正的停止線程。如果在此基礎上進入堵塞狀态(sleep(),wait(),join()),馬上就會抛出一個InterruptedException,且中斷标志被清除,重新設定為false,線程退出。是以退出線程的方式不僅僅是sleep()+interrupt()方法,其它的暫停線程的方式都可以。
package com.jia.thread;
/**
* @author 賈文靜 on 2018/6/6.
* Describe
*/
public class InterruptService implements Runnable {
//如果使用Callable接口中call方法異常就會得以擴散
@Override
public void run() {
try {
System.out.println( "begin run" );
//重要:無論是先中斷還是先阻塞都能達到停止線程的目的,隻要兩者配置使用就可以到達效果
Thread.currentThread().interrupt();
//方式一,線程進入sleep
// Thread.sleep( 10 );
//方式二、join
// Thread.currentThread().join();
//方式三、wait
// Thread.currentThread().wait();
System.out.println( "begin end" );
} catch (Exception e) {
System.out.println("先interrupt再阻塞後終止了");
e.printStackTrace();
}
}
}
package com.jia.thread;
/**
* @author 賈文靜 on 2018/6/6.
* Describe
*/
public class SleepThread {
public static void main(String[] args) throws InterruptedException {
try {
InterruptService interruptService = new InterruptService();
Thread thread = new Thread(interruptService);
thread.start();
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
interrupt簡述
interrupt()方法隻是改變中斷狀态,不會中斷一個正在運作的線程。需要使用者自己去監視線程的狀态為并做處理。支援線程中斷的方法(也就是線程中斷後會抛出interruptedException的方法)就是在監視線程的中斷狀态,一旦線程的中斷狀态被置為“中斷狀态”,就會抛出中斷異常。這一方法實際完成的是,給受阻塞的線程發出一個中斷信号,這樣受阻線程檢查到中斷辨別,就得以退出阻塞的狀态。
更确切的說,如果線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,此時調用該線程的interrupt()方法,那麼該線程将抛出一個 InterruptedException中斷異常(該線程必須事先預備好處理此異常),進而提早地終結被阻塞狀态。如果線程沒有被阻塞,這時調用 interrupt()将不起作用,直到執行到wait(),sleep(),join()時,才馬上會抛出 InterruptedException。
this.interrupted()
測試目前線程是否已經中斷(靜态方法)。傳回的是上一次的中斷狀态,并且會清除該狀态,是以連續調用兩次,第一次傳回true,第二次傳回false。