摘要:在并發(fā)編程學(xué)習(xí)之三種線程啟動(dòng)方式中有提過。是否執(zhí)行結(jié)束,包括正常執(zhí)行結(jié)束或異常結(jié)束。獲取返回值,沒有得到返回值前一直阻塞。運(yùn)行結(jié)果如下由于任務(wù)被取消,所以拋出異常。注意的是,此時(shí)線程還在跑,和返回的是。并不能讓任務(wù)真正的結(jié)束。
FutureTask
在java并發(fā)編程學(xué)習(xí)之三種線程啟動(dòng)方式中有提過。主要的方法如下:
cancel(boolean mayInterruptIfRunning):取消任務(wù)的執(zhí)行失敗,返回false,比如任務(wù)已經(jīng)執(zhí)行結(jié)束,或者已經(jīng)被取消,或者不能被取消。如果執(zhí)行成功了,返回ture。mayInterruptIfRunning的作用是是否中斷,如果是true則中斷,本質(zhì)還是調(diào)用interrupt方法。
isCancelled:判斷任務(wù)是否被取消,任務(wù)結(jié)束包括正常執(zhí)行結(jié)束或異常結(jié)束,返回true。
isDone:是否執(zhí)行結(jié)束,包括正常執(zhí)行結(jié)束或異常結(jié)束。結(jié)束返回true。
get:獲取返回值,沒有得到返回值前一直阻塞。
public class FutureTaskDemo { static class Thread1 implements Callable { @Override public Object call() throws Exception { System.out.println("before fun"); fun(); System.out.println("after fun"); return null; } public void fun() { while (true) { } } } public static void main(String[] args) { Thread1 thread1 = new Thread1(); FutureTask futureTask = new FutureTask(thread1); Thread thread = new Thread(futureTask); thread.start(); try { Thread.sleep(1000); System.out.println("cancel:" + futureTask.cancel(true)); Thread.sleep(1000); System.out.println("isCancelled:" + futureTask.isCancelled()); System.out.println("isDone:" + futureTask.isDone()); System.out.println(futureTask.get()); } catch (InterruptedException e) { System.out.println("InterruptedException"); } catch (ExecutionException e) { System.out.println("ExecutionException"); } catch (CancellationException e) { System.out.println("CancellationException"); } } }
運(yùn)行結(jié)果如下:
由于任務(wù)被取消,所以拋出CancellationException異常。注意的是,此時(shí)thread1線程還在跑,isCancelled和isDone返回的是true。cancel并不能讓任務(wù)真正的結(jié)束。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75319.html
摘要:類這是方式啟動(dòng)的運(yùn)行結(jié)果如下接口這是方式啟動(dòng)的運(yùn)行結(jié)果如下接口運(yùn)行結(jié)果如下接口和接口的區(qū)別可以有返回值。通過包裝成,傳遞給,因?yàn)槭菍?shí)現(xiàn)了接口。 類Thread public class ThreadDemo extends Thread { public static void main(String[] args) { ThreadDemo thread = ...
摘要:抽象類,實(shí)現(xiàn)了的接口。將任務(wù)封裝成提交任務(wù)主要方法在任務(wù)是否超時(shí)超時(shí)時(shí)間任務(wù)書用于存放結(jié)果的,先完成的放前面。 AbstractExecutorService抽象類,實(shí)現(xiàn)了ExecutorService的接口。 newTaskFor 將任務(wù)封裝成FutureTask protected RunnableFuture newTaskFor(Runnable runnable, T va...
摘要:線程安全問題在并發(fā)編程學(xué)習(xí)之基礎(chǔ)概念提到,多線程的劣勢(shì)之一,有個(gè)線程安全問題,現(xiàn)在看看下面的例子。那么,該怎么解決呢,很簡(jiǎn)單,在方法前加個(gè)同步鎖。運(yùn)行結(jié)果如下有兩種情況,是因?yàn)榭凑l先搶占鎖,但是輸出的算法結(jié)果是正確的。 線程安全問題 在java并發(fā)編程學(xué)習(xí)之基礎(chǔ)概念提到,多線程的劣勢(shì)之一,有個(gè)線程安全問題,現(xiàn)在看看下面的例子。 public class NotSafeDemo { ...
摘要:在并發(fā)編程學(xué)習(xí)之顯示鎖里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在源碼分析的基礎(chǔ)上,我們看看和的區(qū)別在什么地方。而非公平鎖直接嘗試獲取鎖。 在java并發(fā)編程學(xué)習(xí)之顯示鎖Lock里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在AQS源碼分析的基礎(chǔ)上,我們看看NonfairSync和FairSync的區(qū)別在什么地方。 lock方法 ...
摘要:但是的語(yǔ)義不足以確保遞增操作的原子性,在多線程的情況下,線程不一定是安全的。檢查某個(gè)狀態(tài)標(biāo)記,以判斷是否退出循環(huán)某個(gè)方法這邊和用普通的變量的區(qū)別是,在多線程的情況下,取到后,的值被改變了,判斷會(huì)不正確。 多線程為什么是不安全的 這邊簡(jiǎn)單的講述一下,參考java并發(fā)編程學(xué)習(xí)之synchronize(一) 當(dāng)線程A和線程B同時(shí)進(jìn)入num = num + value; 線程A會(huì)把num的值...
閱讀 3820·2021-10-12 10:12
閱讀 1453·2021-10-11 10:58
閱讀 2290·2021-10-09 10:01
閱讀 2597·2021-09-24 09:48
閱讀 2699·2021-09-09 11:38
閱讀 3526·2019-08-30 15:44
閱讀 1724·2019-08-30 14:22
閱讀 518·2019-08-29 12:42