1. 程式人生 > >Java實現非同步呼叫

Java實現非同步呼叫

一、建立執行緒

 @Test
public void test0() throws Exception {
  System.out.println("main函式開始執行");
  Thread thread=new Thread(new Runnable() {
    @Override
    public void run() {
      System.out.println("===task start===");
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("===task finish===");
    }
  });

  thread.start();
  System.out.println("main函式執行結束");

}

二、Future

   jdk8之前的實現方式,在JUC下增加了Future,從字面意思理解就是未來的意思,但使用起來卻著實有點雞肋,並不能實現真正意義上的非同步,獲取結果時需要阻塞執行緒,或者不斷輪詢。

@Test
public void test1() throws Exception {

    System.out.println("main函式開始執行");

    ExecutorService executor = Executors.newFixedThreadPool(1);
    Future<Integer> future = executor.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {

            System.out.println("===task start===");
            Thread.sleep(5000);
            System.out.println("===task finish===");
            return 3;
        }
    });
    //這裡需要返回值時會阻塞主執行緒,如果不需要返回值使用是OK的。倒也還能接收
    //Integer result=future.get();
    System.out.println("main函式執行結束");

    System.in.read();

}

三、CompletableFuture

     使用原生的CompletableFuture實現非同步操作,加上對lambda的支援,可以說實現非同步任務已經發揮到了極致。

 @Test
public void test2() throws Exception {
    System.out.println("main函式開始執行");
    ExecutorService executor = Executors.newFixedThreadPool(2);
    CompletableFuture<Integer> future = CompletableFuture.supplyAsync(new Supplier<Integer>() {
        @Override
        public Integer get() {
            System.out.println("===task start===");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("===task finish===");
            return 3;
        }
    }, executor);
    future.thenAccept(e -> System.out.println(e));
    System.out.println("main函式執行結束");
}

四、Spring的Async註解

        使用spring實現非同步需要開啟註解,可以使用xml方式或者java config的方式。

xml方式:

<task:annotation-driven executor="executor" />
<task:executor id="executor"
        pool-size="2" 執行緒池的大小
        queue-capacity="100" 排隊佇列長度 
        keep-alive="120" 執行緒保活時間(單位秒)
        rejection-policy="CALLER_RUNS" 對拒絕的任務處理策略 />

java方式:

@EnableAsync
public class MyConfig {

    @Bean
    public TaskExecutor executor(){
        ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10); //核心執行緒數
        executor.setMaxPoolSize(20);  //最大執行緒數
        executor.setQueueCapacity(1000); //佇列大小
        executor.setKeepAliveSeconds(300); //執行緒最大空閒時間
        executor.setThreadNamePrefix("fsx-Executor-"); //指定用於新建立的執行緒名稱的字首。
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}

(1)@Async

@Test
public void test3() throws Exception {
    System.out.println("main函式開始執行");
    myService.longtime();
    System.out.println("main函式執行結束");
}

 @Async
public void longtime() {
    System.out.println("我在執行一項耗時任務");
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("完成");

}

(2)AsyncResult

     如果需要返回值,耗時方法返回值用AsyncResult包裝。

@Test
public void test4() throws Exception {
    System.out.println("main函式開始執行");
    Future<Integer> future=myService.longtime2();
    System.out.println("main函式執行結束");
    System.out.println("非同步執行結果:"+future.get());
}

 @Async
public Future<Integer> longtime2() {
    System.out.println("我在執行一項耗時任務");

    try {
        Thread.sleep(8000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("完成");
    return new AsyncResult<>(3);
}

相關推薦

java實現非同步呼叫例項

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java 實現非同步呼叫

首先 我遇到的問題是 介面呼叫時需要更新快取 而更新快取又是個說快不快的過程 所以打算做非同步呼叫 返回我所需要的結果即可 ,至於快取什麼時候更新完 就不是我所需要關注的了廢話不多說 上程式碼public class MyExecutor {    private Execu

Java實現非同步呼叫

一、建立執行緒 @Test public void test0() throws Exception { System.out.println("main函式開始執行"); Thread thread=new Thread(new Runnable() { @Overr

教你如何用 Java 實現非同步呼叫

導讀 本教程教你如何使用Java實現非同步呼叫。 一、建立執行緒 @Test

Java多執行緒實現非同步呼叫

在JAVA平臺,實現非同步呼叫的角色有如下三個角色:呼叫者 提貨單   真實資料 一個呼叫者在呼叫耗時操作,不能立即返回資料時,先返回一個提貨單.然後在過一斷時間後憑提貨單來獲取真正的資料. 去蛋糕店買蛋糕,不需要等蛋糕做出來(假設現做要很長時間),只需要領個提貨單就可以了(去幹別的事情),等到蛋糕做好

Java future 到 Guava ListenableFuture實現非同步呼叫

前言      隨著移動網際網路的蓬勃發展,手機App層出不窮,其業務也隨之變得錯綜複雜。針對於開發人員來說,可能之前的一個業務只需要調取一次第三方介面以獲取資料,而如今隨著需求的增加,該業務需調取多個不同的第三方介面。通常,我們處理方法是讓程式碼

Java多執行緒實現非同步呼叫的方法

一個呼叫者在呼叫耗時操作,不能立即返回資料時,先返回一個提貨單.然後在過一斷時間後憑提貨單來獲取真正的資料. 去蛋糕店買蛋糕,不需要等蛋糕做出來(假設現做要很長時間),只需要領個提貨單就可以了(去幹別的事情),等到蛋糕做好了,再拿提貨單取蛋糕就可以了。 ? 1

Spring Boot2.0之@Async實現非同步呼叫

 補充一個知識點: lombok底層原理使用的是: 位元組碼技術ASM修改位元組碼檔案,生成比如類似於get() set( )方法 一定要在開發工具安裝 在編譯時候修改位元組碼檔案(底層使用位元組碼技術),線上環境使用編譯好的檔案   下面我們學習 Spring Boot 非同步呼

Spring Boot 基礎系列教程 | 第三十二篇:使用@Async實現非同步呼叫:自定義執行緒池

推薦 Spring Boot/Cloud 視訊: 在之前的Spring Boot基礎教程系列中,已經通過《Spring Boot中使用@Async實現非同步呼叫》一文介紹過如何使用@Async註解來實現非同步呼叫了。但是,對於這些非同步執行的控制是我們保障自身

Spring Boot中使用@Async實現非同步呼叫

一 點睛 1 什麼是“非同步呼叫” “非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非

springboot乾貨——(十六)使用@Async實現非同步呼叫

非同步呼叫針對的是同步呼叫,一般在程式碼中我們使用同步呼叫相對較多,即請求程式碼立即返回結果或者說執行程式碼,非同步呼叫則是指請求之後不會裡面返回結果或者是呼叫程式碼。 接下來我們用例項來看下什麼是同步呼叫: 新建一個springboot專案後建立對應的task類: pa

Spring boot ApplicationEvent實現非同步呼叫

1.什麼是事件機制 事件機制在java的設計模式中也可以叫監聽器模式或者是觀察者模式。 當有事件發生時,通知關注次事件的物件傳送訊息,告訴它有一個事件發生了,那麼怎麼知道通知誰呢? 那必須要在對這個事件感興趣的物件中定義這個事件,一旦有事件發生了,對事件有興

使用 RabbitMQ 實現非同步呼叫

目錄 引言 啟動 RabbitMQ 伺服器 執行 rabbitmq 容器 RabbitMQ 控制檯 Exchange 和 Queue 開發服務端和客戶端 開發服務端 開發客戶端 Java Bean 型別傳輸 結語

Spring @Async實現非同步呼叫示例

什麼是“非同步呼叫”?        “非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。 同步呼叫 下面通過一個簡單示例來直觀的理解什麼是同步呼叫:

c#使用委託實現非同步呼叫

非同步程式設計是受公共語言執行庫的許多領域(如遠端處理、ASP.NET 和 Windows 窗體)支援的功能。非同步程式設計是 .NET Framework 中的核心概念。使用 .NET 非同步程式設計,在程式繼續執行的同時對 .NET 類方法進行呼叫,直到進行指定的回撥為止

Spring Boot學習(十二)之Spring Boot使用@Async實現非同步呼叫

什麼是“非同步呼叫”?“非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回

Ajax+jQuery+bootstrap+Java實現非同步點贊功能,並限制點選次數

(下面截圖是自己專案的截圖) 當已經點贊後,滑鼠再經過時,就會顯示 "禁止的圖示"  (相應的class 會變化) cursor:not-allowed 在很多的網站上有很多不同的點贊,我不知道他們是怎麼實現的,下面我來分享一下我寫的點贊實現,共大家參考下, 這是我在一個專案抽取的程式碼

Spring Boot使用@Async實現非同步呼叫返回結果:使用Future以及定義超時

關於使用 @Async實現非同步呼叫的內容,也得到不少童鞋的反饋,其中問題比較多的就是關於返回 Future的使用方法以及對非同步執行的超時控制,所以這篇就來一起講講這兩個問題的處理。 如果您對於 @Async註解的使用還不瞭解的話,可以看看之前的文章,具體如下: 定

SpringBoot之——使用@Async實現非同步呼叫

一、什麼是“非同步呼叫”“非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。二、同步呼叫下面通過一個簡單示例來直觀的理解什麼是

JAVA非同步呼叫

前言:在實際的業務中總有這樣的場景,後臺執行的時間過長,前端需要立即返回結果,以取得良好的客戶體驗。那麼後臺的非同步呼叫改怎麼實現呢? 1、 使用callable介面,加執行緒池 2、 使用JAVA的回撥機制 3、 使用spring框架預設的非同步呼