Java中的FutureTask實現(xiàn)代碼實例
FutureTask實現(xiàn)
FutureTask是Future的實現(xiàn),用來異步任務的獲取結(jié)果,可以啟動和取消異步任務,查詢異步任務是否計算結(jié)束以及獲取最終的異步任務的結(jié)果。
通過get()方法來獲取異步任務的結(jié)果,但是會阻塞當前線程直至異步任務執(zhí)行結(jié)束。
一旦任務執(zhí)行結(jié)束,任務不能重新啟動或取消,除非調(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";
}
//從容器中取出當前線程
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 編程式事務使用及兩種實現(xiàn)方式
編程式事務管理是通過編寫代碼來管理事務,相對于聲明式事務(@Transactional注解),它提供了更細粒度的事務控制,這篇文章主要介紹了SpringBoot 編程式事務使用及兩種實現(xiàn)方式,需要的朋友可以參考下2024-12-12
SpringBoot整合mybatis-generator-maven-plugin的方法
這篇文章主要介紹了SpringBoot整合mybatis-generator-maven-plugin,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

