欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java異步編程之Callbacks與Futures模型詳解

 更新時(shí)間:2023年03月24日 14:05:11   作者:愛我-中華  
這篇文章主要為大家詳細(xì)介紹了Java異步編程中Callbacks與Futures模型的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、Callbacks模型

該模型的異步方法,在異步任務(wù)完成之后調(diào)用,主線程沒有異步線程的結(jié)果。經(jīng)典模型如Swing’s EventListener模型(如果不了解可參考html如何實(shí)現(xiàn)button的click方法)

1.1示例

public class CallbackModel implements Callback, Runnable {
    @Override
    public void invoke() {
        System.out.println("這是異步回調(diào)的結(jié)果");
    }
    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)開始");
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)結(jié)束");
            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() + "::主線程結(jié)束");
    }
}
interface Callback {
    void invoke();
}

1.2運(yùn)行結(jié)果

main::主線程開始
main::主線程結(jié)束
線程一::異步線程任務(wù)開始
線程一::異步線程任務(wù)結(jié)束
這是異步回調(diào)的結(jié)果

二、Futures模型

? 該模型的異步方法,立刻返回一個(gè)包裝了結(jié)果的返回值Future,T即是包裝的返回值,但返回值不可立即訪問(異步方法為完成),F(xiàn)uture對(duì)象包裝了對(duì)它的訪問??梢暂喸儗?duì)象,直到該值可用為止。

2.1用例

public class FutureModel {

    static class FutureTask implements Callable {

        @Override
        public Object call()  {
            try {
                System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)開始");
                Thread.sleep(4000);
                System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)結(jié)束");
            } 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() + "返回的結(jié)果::" + submit.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }finally {
            pool.shutdown();
        }
    }
}

2.1用例結(jié)果

pool-1-thread-1::異步線程任務(wù)開始
pool-1-thread-1::異步線程任務(wù)結(jié)束
main返回的結(jié)果::1234

三、Future接口

/**
*異步計(jì)算的結(jié)果
*/
public interface Future<V> {

    /**
     * 嘗試取消任務(wù),有可能失敗
     */
    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();

    /**
     * 等待直至獲取結(jié)果
     */
    V get() throws InterruptedException, ExecutionException;

    /**
     * 等待指定的時(shí)間獲取結(jié)果,否則拋出異常
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

四、小結(jié)

1.兩種模型還是基于java的Runnable接口和Callable接口

2.Runnable接口配合Thread創(chuàng)建線程,通常不關(guān)注返回結(jié)果。

3.Callable接口配合Executors(java提供的線程池管理工具)與Future(封裝返回結(jié)果),常用場(chǎng)景是主線程需要獲取異步的結(jié)果。

到此這篇關(guān)于Java異步編程之Callbacks與Futures模型詳解的文章就介紹到這了,更多相關(guān)Java Callbacks Futures內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea 模板編程知識(shí)小結(jié)

    idea 模板編程知識(shí)小結(jié)

    這篇文章主要介紹了idea 模板編程的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一文學(xué)會(huì)使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證

    一文學(xué)會(huì)使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證

    這篇文章主要為大家介紹了使用sa-token解決網(wǎng)站權(quán)限驗(yàn)證方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Spring的Bean注入解析結(jié)果BeanDefinition詳解

    Spring的Bean注入解析結(jié)果BeanDefinition詳解

    這篇文章主要介紹了Spring的Bean注入解析結(jié)果BeanDefinition詳解,BeanDefinition描述了一個(gè)bean實(shí)例,擁有屬性值、構(gòu)造參數(shù)值和具體實(shí)現(xiàn)的其他信息,其是一個(gè)bean的元數(shù)據(jù),xml中配置的bean元素會(huì)被解析成BeanDefinition對(duì)象,需要的朋友可以參考下
    2023-12-12
  • SpringBoot常見get/post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)及參數(shù)自定義注解校驗(yàn)詳解

    SpringBoot常見get/post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)及參數(shù)自定義注解校驗(yàn)詳解

    這篇文章主要給大家介紹了關(guān)于SpringBoot常見get/post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)及參數(shù)自定義注解校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Java中的Lock與ReentrantLock深入解析

    Java中的Lock與ReentrantLock深入解析

    這篇文章主要介紹了Java中的Lock與ReentrantLock深入解析,Lock位于java.util.concurrent.locks包下,是一種線程同步機(jī)制,就像synchronized塊一樣,但是,Lock比synchronized塊更靈活、更復(fù)雜,需要的朋友可以參考下
    2024-01-01
  • 使用feign服務(wù)調(diào)用添加Header參數(shù)

    使用feign服務(wù)調(diào)用添加Header參數(shù)

    這篇文章主要介紹了使用feign服務(wù)調(diào)用添加Header參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java中關(guān)于移位運(yùn)算符的demo與總結(jié)(推薦)

    java中關(guān)于移位運(yùn)算符的demo與總結(jié)(推薦)

    下面小編就為大家?guī)硪黄猨ava中關(guān)于移位運(yùn)算符的demo與總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • java List 排序之冒泡排序?qū)嵗a

    java List 排序之冒泡排序?qū)嵗a

    這篇文章主要介紹了java List 排序之冒泡排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java詳細(xì)分析連接數(shù)據(jù)庫的流程

    Java詳細(xì)分析連接數(shù)據(jù)庫的流程

    Java數(shù)據(jù)庫連接,JDBC是Java語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法。JDBC也是Sun Microsystems的商標(biāo)。我們通常說的JDBC是面向關(guān)系型數(shù)據(jù)庫的
    2022-05-05
  • Spring設(shè)計(jì)模式中代理模式詳細(xì)講解

    Spring設(shè)計(jì)模式中代理模式詳細(xì)講解

    如何實(shí)現(xiàn)在不修改源碼的基礎(chǔ)上實(shí)現(xiàn)代碼功能的增強(qiáng)呢?spring為我們提供了代理模式。所謂的代理模式通俗來說就是一個(gè)中介,它給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制原對(duì)象的引用,從而實(shí)現(xiàn)在不修改源碼的基礎(chǔ)上實(shí)現(xiàn)代碼功能的增強(qiáng)
    2023-01-01

最新評(píng)論