日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Future取消线程执行

發(fā)布時(shí)間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Future取消线程执行 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【README】

本文總結(jié)于 《java并發(fā)編程實(shí)戰(zhàn)》 page121,非常棒的一本書;


【1】Future

1,介紹:future 用于管理任務(wù)的生命周期,處理異常,以及實(shí)現(xiàn)取消;

2,future.cancel() 取消方法有一個(gè)boolean類型的參數(shù)? mayInterruptIfRunning, 表示取消操作是否成功;如果為ture,并任務(wù)當(dāng)前正在某個(gè)線程中執(zhí)行,則該線程能被中斷;

【1.1】例子:

通過 future.cancel(true) 中斷任務(wù)所屬線程;

/*** @Description future取消任務(wù)測試* @author xiao tang* @version 1.0.0* @createTime 2022年02月20日*/ public class FutureCancelTest {static ExecutorService executorService = Executors.newFixedThreadPool(3);public static void main(String[] args) throws Exception {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("【子線程】任務(wù)開始運(yùn)行");while(!Thread.currentThread().isInterrupted()) {try {System.out.println("【子線程】睡眠3秒");TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {System.out.println("【子線程】拋出中斷異常");Thread.currentThread().interrupt(); // 重置中斷狀態(tài) tag2 }}System.out.println("【子線程】任務(wù)結(jié)束");}};timeRun(runnable, 1, TimeUnit.SECONDS);// 關(guān)閉線程池executorService.shutdown();System.out.println("【主線程】關(guān)閉線程池");}static void timeRun(Runnable r, long timeout, TimeUnit timeUnit) throws Exception {Future<?> future = executorService.submit(r);try {System.out.println("【主線程】調(diào)用get() 阻塞");future.get(timeout, timeUnit);} catch (TimeoutException e1) {System.out.println("【主線程】超時(shí)異常");} catch (ExecutionException e2) {System.out.println("【主線程】任務(wù)執(zhí)行異常");throw e2;} finally {System.out.println("【主線程】取消任務(wù)");future.cancel(true); // 如果任務(wù)正在運(yùn)行,那么將被中斷 tag1}} }

打印結(jié)果:

【主線程】調(diào)用get() 阻塞
【子線程】任務(wù)開始運(yùn)行
【子線程】睡眠3秒
【主線程】超時(shí)異常
【主線程】取消任務(wù)
【子線程】拋出中斷異常
【子線程】任務(wù)結(jié)束
【主線程】關(guān)閉線程池

【代碼解說】

tag1的代碼,取消任務(wù),傳入的參數(shù)為true,則會中斷任務(wù)所屬線程,即設(shè)置該子線程的中斷狀態(tài)為true;

  • 情況1)如果這個(gè)時(shí)候子線程調(diào)用 中斷式阻塞方法,如sleep,join等,則java底層會拋出中斷異常,且清空中斷狀態(tài)(即設(shè)置為false); 如果 刪除tag2(重置中斷狀態(tài)為true) 的代碼,那么循環(huán)不會結(jié)束,子線程無法正常結(jié)束,所以需要tag2;
  • 情況2)如果這個(gè)時(shí)候 子線程沒有調(diào)用中斷式阻塞方法,這個(gè)時(shí)候 while循環(huán)條件不滿足(因?yàn)檫@個(gè)時(shí)候線程中斷狀態(tài)為true),所以子線程退出循環(huán);

無論怎樣,只要保證 tag2代碼存在,不管是哪一種情況,總是可以使得子線程運(yùn)行結(jié)束(任務(wù)運(yùn)行結(jié)束);

總結(jié)

以上是生活随笔為你收集整理的Future取消线程执行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。