天天看點

【多線程】——深入了解線程中斷方式(interrupt)

    最近在系統回顧多線程這一部分的内容,對線程中斷方式這一部分相比之前有了不同的認識。整理一下,如有了解偏頗之處,還請各位大神不惜賜教。

    在看高洪岩《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。

總結

繼續閱讀