Java多線程之Future設(shè)計(jì)模式
Future -> 代表的是未來(lái)的一個(gè)憑據(jù)
public interface Future<T> {
T get() throws InterruptedException;
}
AsynFuture -> Future具體實(shí)現(xiàn)類(lèi)
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();
}
}
/**
* 輪詢(xún) 沒(méi)有完成等待
*/
@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)
* 無(wú)需進(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 -> 代表的是未來(lái)的一個(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 -> 代表的是未來(lái)的一個(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多線程之讀寫(xiě)鎖分離設(shè)計(jì)模式
- Java多線程 自定義線程池詳情
- Java多線程之同步工具類(lèi)Exchanger
- Java多線程之同步工具類(lèi)CountDownLatch
- Java多線程之同步工具類(lèi)CyclicBarrier
- Java多線程之Semaphore實(shí)現(xiàn)信號(hào)燈
- Java多線程 兩階段終止模式Two-Phase Termination Patter
相關(guān)文章
springboot中rabbitmq實(shí)現(xiàn)消息可靠性機(jī)制詳解
這篇文章主要介紹了springboot中rabbitmq實(shí)現(xiàn)消息可靠性機(jī)制詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)
數(shù)據(jù)庫(kù)表中應(yīng)該都要有create_time、update_time字段;那么在開(kāi)發(fā)中,對(duì)于這些共有字段的處理應(yīng)該要進(jìn)行統(tǒng)一,這樣就可以簡(jiǎn)化我們的開(kāi)發(fā)過(guò)程。那么本文就對(duì)Mybatis-Plus中的字段自動(dòng)填充進(jìn)行記錄2021-11-11
Java網(wǎng)絡(luò)編程之簡(jiǎn)易聊天室的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)易聊天室功能,可以實(shí)現(xiàn)運(yùn)行客戶(hù)端和連接服務(wù)器,文中的示例代碼講解詳細(xì),需要的可以了解一下2022-10-10
淺談Java中ArrayList的擴(kuò)容機(jī)制
本文主要介紹了淺談Java中ArrayList的擴(kuò)容機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
springboot開(kāi)發(fā)擴(kuò)展springmvc實(shí)現(xiàn)解析
這篇文章主要介紹了springboot開(kāi)發(fā)擴(kuò)展springmvc實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
java.exe和javaw.exe的區(qū)別及使用方法
這篇文章主要介紹了java.exe和javaw.exe的區(qū)別及使用方法,需要的朋友可以參考下2014-04-04
Feign實(shí)現(xiàn)跨服務(wù)文件上傳下載
這篇文章主要為大家詳細(xì)介紹了Feign實(shí)現(xiàn)跨服務(wù)文件上傳下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04

