Java8 - 自定义实现体会Future的原理
生活随笔
收集整理的這篇文章主要介紹了
Java8 - 自定义实现体会Future的原理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 自定義Future
- 同步方式
自定義Future
package com.artisan.java8.testFuture.customFuture;public interface CustomFutureInterface<T> {T get();Boolean isFinished();} package com.artisan.java8.testFuture.customFuture;public interface CustomCallable<T> {T doAction(); } package com.artisan.java8.testFuture.customFuture;import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/4/5 9:40* @mark: show me the code , change the world*/ public class CustomFutureTest<T> {public static <T> CustomFutureInterface<T> invoke(CustomCallable<T> callable){// 使用引用,傳遞結(jié)果AtomicReference<T> result = new AtomicReference<>();AtomicBoolean isDone = new AtomicBoolean(false);// 開啟子線程,執(zhí)行異步任務(wù)new Thread(()->{T t = callable.doAction();// 在子線程中將結(jié)果封裝到原子類中,便于其他線程獲取result.set(t);isDone.set(true);}).start();CustomFutureInterface<T> tCustomFutureInterface = new CustomFutureInterface<T>() {@Overridepublic T get() {return result.get();}@Overridepublic Boolean isFinished() {return isDone.get();}} ;return tCustomFutureInterface;}public static void main(String[] args) {CustomFutureInterface<String> invoke = invoke(() -> {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {return "I'm Error";}return "I'm value";});System.out.println("獲取子線程的返回結(jié)果: " + invoke.get());while(!invoke.isFinished()){try {System.out.println("子線程 沒有結(jié)束,休眠1S...");TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("子線程執(zhí)行結(jié)束了,獲取子線程的返回結(jié)果..." + invoke.get());}}同步方式
為了對(duì)比下,我們來看下同步的方式
/*** 同步阻塞方法* @param callable* @param <T>* @return*/public static <T> T block(CustomCallable<T> callable){return callable.doAction();}調(diào)用測(cè)試
System.out.println(" ");System.out.println("同步測(cè)試ing...............start");long begin = System.currentTimeMillis();//測(cè)試同步String result = block(() -> {{try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {return "I'm Error";}return "I'm value sync";}});System.out.println("同步測(cè)試ing...............end cost " + (System.currentTimeMillis() - begin));System.out.println("返回結(jié)果: " + result);
總結(jié)
以上是生活随笔為你收集整理的Java8 - 自定义实现体会Future的原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring - @Conditiona
- 下一篇: Java8 - Future 接口