Future取消线程执行
生活随笔
收集整理的這篇文章主要介紹了
Future取消线程执行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【README】
本文總結于 《java并發編程實戰》 page121,非常棒的一本書;
【1】Future
1,介紹:future 用于管理任務的生命周期,處理異常,以及實現取消;
2,future.cancel() 取消方法有一個boolean類型的參數? mayInterruptIfRunning, 表示取消操作是否成功;如果為ture,并任務當前正在某個線程中執行,則該線程能被中斷;
【1.1】例子:
通過 future.cancel(true) 中斷任務所屬線程;
/*** @Description future取消任務測試* @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("【子線程】任務開始運行");while(!Thread.currentThread().isInterrupted()) {try {System.out.println("【子線程】睡眠3秒");TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {System.out.println("【子線程】拋出中斷異常");Thread.currentThread().interrupt(); // 重置中斷狀態 tag2 }}System.out.println("【子線程】任務結束");}};timeRun(runnable, 1, TimeUnit.SECONDS);// 關閉線程池executorService.shutdown();System.out.println("【主線程】關閉線程池");}static void timeRun(Runnable r, long timeout, TimeUnit timeUnit) throws Exception {Future<?> future = executorService.submit(r);try {System.out.println("【主線程】調用get() 阻塞");future.get(timeout, timeUnit);} catch (TimeoutException e1) {System.out.println("【主線程】超時異常");} catch (ExecutionException e2) {System.out.println("【主線程】任務執行異常");throw e2;} finally {System.out.println("【主線程】取消任務");future.cancel(true); // 如果任務正在運行,那么將被中斷 tag1}} }打印結果:
【主線程】調用get() 阻塞
【子線程】任務開始運行
【子線程】睡眠3秒
【主線程】超時異常
【主線程】取消任務
【子線程】拋出中斷異常
【子線程】任務結束
【主線程】關閉線程池
【代碼解說】
tag1的代碼,取消任務,傳入的參數為true,則會中斷任務所屬線程,即設置該子線程的中斷狀態為true;
- 情況1)如果這個時候子線程調用 中斷式阻塞方法,如sleep,join等,則java底層會拋出中斷異常,且清空中斷狀態(即設置為false); 如果 刪除tag2(重置中斷狀態為true) 的代碼,那么循環不會結束,子線程無法正常結束,所以需要tag2;
- 情況2)如果這個時候 子線程沒有調用中斷式阻塞方法,這個時候 while循環條件不滿足(因為這個時候線程中斷狀態為true),所以子線程退出循環;
無論怎樣,只要保證 tag2代碼存在,不管是哪一種情況,總是可以使得子線程運行結束(任務運行結束);
總結
以上是生活随笔為你收集整理的Future取消线程执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么实行备案制(备案制推行难)
- 下一篇: (转)如何查看java本地方法