Java並發編程之線程中斷

線程中斷:

void interrupted()方法:中斷線程,例如,當線程A運行時,線程B可以調用線程A的interrupted()方法來設置線程的中斷標志為true並立即返回。設置標志僅僅是為瞭設置標志,線程A實際並沒有被中斷,它會繼續往下執行,如果線程A因為調用瞭wait()方法,join()方法或者sleep()方法而引起的阻塞掛起,這時候若線程B調用線程A的interrupted()方法,線程A回調用這些方法的地方會拋出InterruptedException異常而返回。
boolean isInterrupted()方法:檢測當前線程是否被中斷,如果是返回true,否則返回false
boolean intertupted()方法:檢測當縣線程是否被中斷,如果是返回true,否則返回false。與isInterrupted()不同的是,該方法如果發現線程被中斷,則會清除中斷標志。

package com.heiye.learn1;

import java.util.logging.Logger;

public class InterruptedTest {
    public static void main(String[] args) throws InterruptedException {
        Logger logger=Logger.getLogger(InterruptedTest.class.toString());
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                //如果當前線程被中斷則退出循環
                while (!Thread.currentThread().isInterrupted()){
                    logger.warning(Thread.currentThread()+"Hello");
                }
            }
        });

        //啟動子線程
        thread.start();
        //主線程休眠1s,以便中斷當前讓子線程輸出
        Thread.sleep(1000);
        //中斷子線程
        logger.warning("main thread interrupted thread");
        thread.interrupt();
        //等待子線程執行完畢
        thread.join();
        logger.info("main is over");
    }
}

在如上代碼中,子線程thread通過檢查當前線程中斷標志來控制是否退出循環,主線程在休眠1s後調用瞭threadinterupted()方法設置瞭中斷標志,所以線程thread退出瞭循環。

下面看一種情況,當線程為瞭等待一些特定條件的到來時候,一般會使用sleep()方法,wait(),join()方法來阻塞掛起當前線程。下面看一個例子:

package com.heiye.learn1;

import java.util.logging.Logger;

public class InterruptedTest2 {
    public static void main(String[] args) throws InterruptedException {
        Logger logger = Logger.getLogger(InterruptedTest.class.toString());
        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                logger.info("threadOne begin sleep 2000 seconds");
                try {
                    Thread.sleep(2000000);
                    logger.info("threadOne awaking");
                } catch (InterruptedException e) {
                    logger.warning("threadOne is interrupted while sleeping");
                    return;
                    //e.printStackTrace();
                }
                logger.warning("threadOne-leaving normally")    ;
            }
        });

        threadOne.start();
        //確保子線程進入睡眠狀態
        Thread.sleep(1000);
        //打斷子線程睡眠,讓子線程從sleep返回
        threadOne.interrupt();
        //等待子線程執行完畢
        threadOne.join();
        logger.info("main thread is over");
    }
}

到此這篇關於Java並發編程之線程中斷的文章就介紹到這瞭,更多相關Java線程中斷內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: