您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java異步編程之Callbacks與Futures模型怎么調用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java異步編程之Callbacks與Futures模型怎么調用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
該模型的異步方法,在異步任務完成之后調用,主線程沒有異步線程的結果。經典模型如Swing’s EventListener模型
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(); }
main::主線程開始
main::主線程結束
線程一::異步線程任務開始
線程一::異步線程任務結束
這是異步回調的結果
該模型的異步方法,立刻返回一個包裝了結果的返回值Future,T即是包裝的返回值,但返回值不可立即訪問(異步方法為完成),Future對象包裝了對它的訪問。可以輪詢對象,直到該值可用為止。
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(); } } }
pool-1-thread-1::異步線程任務開始
pool-1-thread-1::異步線程任務結束
main返回的結果::1234
/** *異步計算的結果 */ 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; }
讀到這里,這篇“Java異步編程之Callbacks與Futures模型怎么調用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。