大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java多線程中斷機制

Java多線程中斷機制

更新時間:2020-11-20 17:45:39 來源:動力節點 瀏覽1509次

Java中提供了shop()方法來中斷線程,但由于該方法過于暴力而被定義為過期方法。假如一條線程在修改一段數據時,且已經修改了一半,此時的你強行用shop()方法中斷該線程后,數據處于一半修改過、一半未修改的狀態,該數據就已經廢了(且不會有任何提示)。于是,在Java中采用了新的interrupt方法來完成Java多線程中斷機制

Thread類定義了如下關于中斷的方法:

image.png

=


線程對中斷的反應

1.RUNNABLE:線程在運行或具備運行條件只是在等待操作系統調度


2.WAITING/TIMED_WAITING:線程在等待某個條件或超時


3.BLOCKED:線程在等待鎖,試圖進入同步塊


4.NEW/TERMINATED:線程還未啟動或已結束


public void Thread.interrupt() //中斷線程

public boolean Thread.isInterrupted() //判斷是否被中斷

public static boolean Thread.interrupted() //判斷是否被中斷,且清除當前中斷狀態

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread() {

@Override

public void run () {

while (true) {

Thread.yield();

}

}

};

t1.start();

Thread.sleep(2000);

ti.interrupt();

}

在這里雖然調用了interrupt()方法,但該線程并不會停下。因為該方法只是設置了一個中斷狀態,但該線程并未對此中斷狀態做出反應。

以下代碼進行了對中斷狀態的處理。

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread() {

@Override

public void run () {

while (true) {

if (Thread.currentThread().isInterrupted()){ //此方法返回中斷狀態,且不會清除該中斷狀態。

System.out.println("Interruted!");

breadk;

}

Thread.yield();

}

}

};

t1.start();

Thread.sleep(2000);

ti.interrupt();

}

但我們使用wait() 或者 sleep() 方法時要注意下:

首先得了解下Thread.sleep()函數:

public static native void sleep(long millis) throws InterruptedException

當該線程休眠時如果中斷則會拋出該錯誤,此異常非運行時異常,必須捕獲且處理。

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread() {

@Override

public void run () {

while (true) {

if (Thread.currentThread().isInterrupted()){

//此方法返回中斷狀態,且不會清除該中斷狀態

System.out.println("Interruted!");

break;

}

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

System.out.println("Interruted When Sleep");

// 設置中斷狀態

Thread.currentThread().interrupt();

}

Thread.yield();

}

}

};

t1.start();

Thread.sleep(2000);

t1.interrupt();

}


在catch語塊中本可以進行中斷退出,但我們沒這么做,因為這樣會破壞數據一致性和完整性(和直接使用shop()用異曲同工之妙)。所以我們在異常處理中必須重新設置中斷狀態(因為此時拋出異常后狀態會被清除),讓該線程完成工作后再退出。


那么我們如何正確地取消/關閉線程呢?

1. interrupt方法不一定會真正”中斷”線程,它只是一種協作機制,如果 不明白線程在做什么,不應該貿然的調用線程的interrupt方法,以為這樣就能取消線程。


2. 對于以線程提供服務的程序模塊而言,它應該封裝取消/關閉操作,提供單獨的取消/關閉方法給調用者,類似于InterruptReadDemo中演示的cancel方法,外部調用者應該調用這些方法而不是直接調用interrupt。


3. Java并發庫的一些代碼就提供了單獨的取消/關閉方法,比如說,Future接口提供了如下方法以取消任務:boolean cancel(boolean mayInterruptIfRunning);


4. 再比如,ExecutorService提供了如下兩個關閉方法:

void shutdown();

ListshutdownNow();


5. Future和ExecutorService的API文檔對這些方法都進行了詳細說明,這是我們應該學習的方式。


以上就是Java多線程中斷機制,總的來說,就是采用了interrupt方法來中斷對應的線程。多線程作為Java中的重難點知識點,是我們學好Java的突破口,想要學好Java除了要付出時間和努力,還有有一個好的學習方法。本站的Java多線程教程里面能夠給出系統地學習多線程的方法,助你快速學好Java多線程!


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 手机在线看片不卡中文字幕 | 亚洲精品国产精品乱码视色 | 综合激情在线 | 成人在线视频网 | 国产精品线在线精品国语 | 性做久久久久久久久25的美女 | 四虎影午夜成年免费精品 | h片网站在线观看 | 久久久网久久久久合久久久久 | 全部免费毛片在线 | 国产1区2区3区在线观看 | 亚洲欧洲视频在线 | 久久爆操 | 久久久这里只有精品免费 | videos欧美黑白爆交 | 久久久精品免费 | 亚洲免费一区 | 中文字幕日本精品一区二区三区 | 香蕉久久综合精品首页 | 国产日韩一区二区三区在线播放 | 亚洲播放| 国产又黄又a又潮娇喘视频 国产又色又爽又黄又刺激18 | 国产欧美日韩在线观看 | 人人爱操 | 亚洲欧美一区二区三区在线播放 | 国产精品久久网 | 五月天狠狠干 | 精品欧美一区二区精品久久 | 中文字幕亚洲高清综合 | 亚洲欧美综合一区 | 狠狠操天天爱 | 日本精品视频网站 | 国内自拍在线观看 | 四虎影视紧急入口地址大全 | 人人插97| 91视频第一页 | 国产伦理一区二区三区 | 一本本久综合久久爱 | 最新永久地址 | 精品成人免费一区二区在线播放 | 久久香蕉国产线 |