Java異步編程之Callbacks與Futures模型詳解
一、Callbacks模型
該模型的異步方法,在異步任務完成之后調用,主線程沒有異步線程的結果。經(jīng)典模型如Swing’s EventListener模型(如果不了解可參考html如何實現(xiàn)button的click方法)
1.1示例
public class CallbackModel implements Callback, Runnable { @Override public void invoke() { System.out.println("這是異步回調的結果"); } @Override public void run() { try { System.out.println(Thread.currentThread().getName() + "::異步線程任務開始"); Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + "::異步線程任務結束"); invoke(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println(Thread.currentThread().getName() + "::主線程開始"); new Thread(new CallbackModel(), "線程一").start(); System.out.println(Thread.currentThread().getName() + "::主線程結束"); } } interface Callback { void invoke(); }
1.2運行結果
main::主線程開始
main::主線程結束
線程一::異步線程任務開始
線程一::異步線程任務結束
這是異步回調的結果
二、Futures模型
? 該模型的異步方法,立刻返回一個包裝了結果的返回值Future,T即是包裝的返回值,但返回值不可立即訪問(異步方法為完成),F(xiàn)uture對象包裝了對它的訪問??梢暂喸儗ο螅钡皆撝悼捎脼橹?。
2.1用例
public class FutureModel { static class FutureTask implements Callable { @Override public Object call() { try { System.out.println(Thread.currentThread().getName() + "::異步線程任務開始"); Thread.sleep(4000); System.out.println(Thread.currentThread().getName() + "::異步線程任務結束"); } catch (InterruptedException e) { e.printStackTrace(); } return "1234"; } } public static void main(String[] args) { ExecutorService pool = Executors.newSingleThreadExecutor(); Future<String> submit = pool.submit(new FutureTask()); try { System.out.println(Thread.currentThread().getName() + "返回的結果::" + submit.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }finally { pool.shutdown(); } } }
2.1用例結果
pool-1-thread-1::異步線程任務開始
pool-1-thread-1::異步線程任務結束
main返回的結果::1234
三、Future接口
/** *異步計算的結果 */ public interface Future<V> { /** * 嘗試取消任務,有可能失敗 */ boolean cancel(boolean mayInterruptIfRunning); /** * 判斷是否取消 * * @return {@code true} if this task was cancelled before it completed */ boolean isCancelled(); /** * * 判斷是否完成 * * @return {@code true} if this task completed */ boolean isDone(); /** * 等待直至獲取結果 */ V get() throws InterruptedException, ExecutionException; /** * 等待指定的時間獲取結果,否則拋出異常 */ V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
四、小結
1.兩種模型還是基于java的Runnable接口和Callable接口
2.Runnable接口配合Thread創(chuàng)建線程,通常不關注返回結果。
3.Callable接口配合Executors(java提供的線程池管理工具)與Future(封裝返回結果),常用場景是主線程需要獲取異步的結果。
到此這篇關于Java異步編程之Callbacks與Futures模型詳解的文章就介紹到這了,更多相關Java Callbacks Futures內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring的Bean注入解析結果BeanDefinition詳解
這篇文章主要介紹了Spring的Bean注入解析結果BeanDefinition詳解,BeanDefinition描述了一個bean實例,擁有屬性值、構造參數(shù)值和具體實現(xiàn)的其他信息,其是一個bean的元數(shù)據(jù),xml中配置的bean元素會被解析成BeanDefinition對象,需要的朋友可以參考下2023-12-12SpringBoot常見get/post請求參數(shù)處理、參數(shù)注解校驗及參數(shù)自定義注解校驗詳解
這篇文章主要給大家介紹了關于SpringBoot常見get/post請求參數(shù)處理、參數(shù)注解校驗及參數(shù)自定義注解校驗的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-03-03