Java多線程之Future設(shè)計(jì)模式
Future -> 代表的是未來的一個(gè)憑據(jù)
public interface Future<T> {
T get() throws InterruptedException;
}
AsynFuture -> Future具體實(shí)現(xiàn)類
public class AsynFuture<T> implements Future<T> {
private volatile boolean done = false;
private T result;
public void done(T result){
synchronized (this){
this.result = result;
this.done = true;
this.notifyAll();
}
}
/**
* 輪詢 沒有完成等待
*/
@Override
public T get() throws InterruptedException {
synchronized (this) {
while (!done) {
this.wait();
}
}
return result;
}
}
FutureService -> 橋接Future和FutureTask
public class FutureService {
/**
* 需進(jìn)程等待
*/
public <T> Future<T> submit(final FutureTask<T> task) {
AsynFuture<T> asynFuture = new AsynFuture<>();
new Thread(() -> {
T result = task.call();
asynFuture.done(result);
}).start();
return asynFuture;
}
/**
* 運(yùn)行完 自動(dòng)回調(diào)
* 無需進(jìn)程等待
*/
public <T> Future<T> submit(final FutureTask<T> task, final Consumer<T> consumer) {
AsynFuture<T> asynFuture = new AsynFuture<>();
new Thread(() -> {
T result = task.call();
asynFuture.done(result);
consumer.accept(result);
}).start();
return asynFuture;
}
}
FutureTask -> 將你的調(diào)用邏輯進(jìn)行了隔離
public interface FutureTask<T> {
T call();
}
需要時(shí)回調(diào):
/**
* Future -> 代表的是未來的一個(gè)憑據(jù)
* FutureTask -> 將你的調(diào)用邏輯進(jìn)行了隔離
* FutureService -> 橋接Future和FutureTask
*/
public class SyncInvoker {
public static void main(String[] args) throws InterruptedException {
FutureService futureService = new FutureService();
Future<String> future = futureService.submit(() -> {
try {
Thread.sleep(10001);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "FINISH";
});
System.out.println("==============");
System.out.println("do other thing.");
Thread.sleep(1000);
System.out.println("==============");
/**
* 調(diào)用也形成了阻塞
*/
System.out.println(future.get());
}
}
運(yùn)行:
==============
do other thing.
==============
FINISH
運(yùn)行完自動(dòng)回調(diào):
//**
* Future -> 代表的是未來的一個(gè)憑據(jù)
* FutureTask -> 將你的調(diào)用邏輯進(jìn)行了隔離
* FutureService -> 橋接Future和FutureTask
*/
public class SyncInvoker {
public static void main(String[] args) throws InterruptedException {
FutureService futureService = new FutureService();
futureService.submit(() -> {
try {
Thread.sleep(10001);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "FINISH";
},System.out::println);
System.out.println("==============");
System.out.println("do other thing.");
Thread.sleep(1000);
System.out.println("==============");
}
}
到此這篇關(guān)于Java多線程之Future設(shè)計(jì)模式的文章就介紹到這了,更多相關(guān)Java多線程 Future內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java多線程 Producer and Consumer設(shè)計(jì)模式
- Java多線程 ThreadLocal原理解析
- Java多線程 Guarded Suspension設(shè)計(jì)模式
- Java多線程之讀寫鎖分離設(shè)計(jì)模式
- Java多線程 自定義線程池詳情
- Java多線程之同步工具類Exchanger
- Java多線程之同步工具類CountDownLatch
- Java多線程之同步工具類CyclicBarrier
- Java多線程之Semaphore實(shí)現(xiàn)信號(hào)燈
- Java多線程 兩階段終止模式Two-Phase Termination Patter
相關(guān)文章
springboot項(xiàng)目以jar包運(yùn)行的操作方法
公司一個(gè)springboot項(xiàng)目本來是打war包的,突然要改為打jar包,不知所措了,糾結(jié)該如何操作呢,折騰半天終于搞定了,下面把解決方案分享給大家,對(duì)springboot打jar包方式感興趣的朋友一起看看吧2021-06-06
Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究
這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
MyBatis 執(zhí)行動(dòng)態(tài) SQL語句詳解
大家對(duì)mybatis執(zhí)行任意sql語句都了解,那么MyBatis執(zhí)行動(dòng)態(tài)SQL語句呢?下面腳本之家小編給大家解答下mybatis執(zhí)行動(dòng)態(tài)sql語句的方法,非常不錯(cuò),感興趣的朋友參考下吧2016-08-08
Spring實(shí)戰(zhàn)之容器中的工程Bean用法示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之容器中的工程Bean用法,結(jié)合實(shí)例形式分析了Sring框架容器中的工程Bean相關(guān)配置、使用操作技巧,需要的朋友可以參考下2019-11-11
關(guān)于JDK8升級(jí)17及springboot?2.x升級(jí)3.x詳細(xì)指南
這篇文章主要介紹了關(guān)于JDK8升級(jí)17及springboot?2.x升級(jí)3.x的相關(guān)資料,還討論了JPA包路徑從javax改為jakarta,以及Spring?Boot版本升級(jí)和Redis配置調(diào)整等,需要的朋友可以參考下2025-01-01
用Java實(shí)現(xiàn)一個(gè)靜態(tài)鏈表的方法步驟
這篇文章主要介紹了用Java實(shí)現(xiàn)一個(gè)靜態(tài)鏈表的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
如何自定義Jackson序列化?@JsonSerialize
這篇文章主要介紹了如何自定義Jackson序列化?@JsonSerialize,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

