Java中的FutureTask實現(xiàn)代碼實例
FutureTask實現(xiàn)
FutureTask是Future的實現(xiàn),用來異步任務(wù)的獲取結(jié)果,可以啟動和取消異步任務(wù),查詢異步任務(wù)是否計算結(jié)束以及獲取最終的異步任務(wù)的結(jié)果。
通過get()方法來獲取異步任務(wù)的結(jié)果,但是會阻塞當(dāng)前線程直至異步任務(wù)執(zhí)行結(jié)束。
一旦任務(wù)執(zhí)行結(jié)束,任務(wù)不能重新啟動或取消,除非調(diào)用runAndReset()方法
代碼示例:
public class ThreadTest_Demo { static ExecutorService executors = Executors.newScheduledThreadPool(2); public ThreadTest_Demo() { } public static void main(String[] args) throws ExecutionException, InterruptedException { Callable<String> callable = new Callable<String>() { public String call() throws Exception { String str = "返回某個數(shù)據(jù)!"; return str; } }; Future<String> submit = executors.submit(callable); KaneFutureTask<String> futureTask = new KaneFutureTask(callable); (new Thread(futureTask)).start(); System.out.println((String)futureTask.get()); } }
實現(xiàn)一個自己的FutureTask
根據(jù)FutureTask核心原理,要實現(xiàn)一個FutureTask必須滿足以下方面:
- 需要泛型定義用以返回結(jié)果類型
- 需要一個callable對象,在構(gòu)造方法中傳入
- 需要實現(xiàn)runnable接口,在run方法中實現(xiàn)具體結(jié)果計算
- 需要一個公開的get方法來獲取結(jié)果
- 如果線程沒有執(zhí)行完,則調(diào)用get方法的線程需要進入等待隊列
- 需要一個字段記錄線程執(zhí)行的狀態(tài)
- 需要一個等待隊列存儲等待結(jié)果的線程
代碼示例:
public class KaneFutureTask<T> implements Runnable { private Callable<T> callable; T result;//返回的結(jié)果 volatile String state = "NEW";//線程執(zhí)行的狀態(tài) LinkedBlockingQueue<Thread> waiters = new LinkedBlockingQueue();//存儲等待結(jié)果的線程 public KaneFutureTask(Callable<T> callable) { this.callable = callable; } //run()方法未執(zhí)行未必,阻塞 public T get() { if ("END".equals(this.state)) { return this.result; } else { while(!"END".equals(this.state)) {//這里開始阻塞 //把線程存放到容器中 this.waiters.offer(Thread.currentThread()); //阻塞 LockSupport.park(); } return this.result; } } public void run() { try { //執(zhí)行Callable的call方法 this.result = this.callable.call(); } catch (Exception var5) { var5.printStackTrace(); } finally { //線程狀態(tài)修改 this.state = "END"; } //從容器中取出當(dāng)前線程 Thread waiter = (Thread)this.waiters.poll(); for(waiter != null) { //取消阻塞 LockSupport.unpark(waiter); waiter = (Thread)this.waiters.poll() } } }
到此這篇關(guān)于Java中的FutureTask手寫代碼實例的文章就介紹到這了,更多相關(guān)FutureTask代碼實例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 編程式事務(wù)使用及兩種實現(xiàn)方式
編程式事務(wù)管理是通過編寫代碼來管理事務(wù),相對于聲明式事務(wù)(@Transactional注解),它提供了更細(xì)粒度的事務(wù)控制,這篇文章主要介紹了SpringBoot 編程式事務(wù)使用及兩種實現(xiàn)方式,需要的朋友可以參考下2024-12-12SpringBoot整合mybatis-generator-maven-plugin的方法
這篇文章主要介紹了SpringBoot整合mybatis-generator-maven-plugin,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Java基礎(chǔ)之詳細(xì)總結(jié)五種常用運算符
在通常代碼邏輯處理中,我們常常都會使用到運算符,今天我們就詳細(xì)了解一下運算符的使用以及分類.運算符是對常量或者變量進行操作的符號,它分為算術(shù)運算符,賦值運算符,比較運算符,邏輯運算符以及位運算符.需要的朋友可以參考下2021-05-05