首頁 > 軟體

java非同步呼叫的4種實現方法

2022-03-11 10:00:02

一.利用多執行緒

直接new執行緒

Thread t = new Thread(){
  @Override
  public void run() {
    longTimeMethod();
  }
};

使用執行緒池

private ExecutorService executor = Executors.newCachedThreadPool() ;

    public void fun() throws Exception {

        executor.submit(new Runnable(){

            @override

                public void run() {

                    try {
                     //要執行的業務程式碼,我們這裡沒有寫方法,可以讓執行緒休息幾秒進行測試

                        Thread.sleep(10000);

                        System.out.print("睡夠啦~");

                    }catch(Exception e) {

                        throw new RuntimeException("報錯啦!!");

                    }

                }

        });

    }

二.採用Spring 的非同步方法去執行(無返回值)

在啟動類或者設定類加上 @EnableAsync 註解.

package me.deweixu.aysncdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableAsync
@SpringBootApplication
public class AysncDemoApplication {

 public static void main(String[] args) {
  SpringApplication.run(AysncDemoApplication.class, args);
 }
}

先把longTimeMethod 封裝到Spring的非同步方法中,這個方法一定要寫在Spring管理的類中,注意註解@Async

@Async註解可以用在方法上,也可以用在類上,用在類上,對類裡面所有方法起作用

@Service
public class AsynchronousService{
  @Async
  public void springAsynchronousMethod(){
    longTimeMethod();
  }
}

其他類呼叫這個方法。這裡注意,一定要其他的類,如果在同類中呼叫,是不生效的。具體原因,可以去學習一下Spring AOP的原理

@Autowired
private AsynchronousService asynchronousService;

public void useAsynchronousMethod(){
  //我們需要執行的程式碼1
  asynchronousService.springAsynchronousMethod();
 //我們需要執行的程式碼2
}

三.採用Spring 的非同步方法+Future接收返回值

先把longTimeMethod 封裝到Spring的非同步方法中,這個非同步方法的返回值是Future的範例。這個方法一定要寫在Spring管理的類中,注意註解@Async。

@Service
public class AsynchronousService{
  @Async
  public Future springAsynchronousMethod(){
    Integer result = longTimeMethod();
    return new AsyncResult(result);
  }
}

其他類呼叫這個方法。這裡注意,一定要其他的類,如果在同類中呼叫,是不生效的。

如果呼叫之後接收返回值,不對返回值進行操作則為非同步操作,進行操作則轉為同步操作,等待對返回值操作完之後,才會繼續執行主程序下面的流程

@Autowired
private AsynchronousService asynchronousService;

public void useAsynchronousMethod(){
    Future future = asynchronousService.springAsynchronousMethod();
    future.get(1000, TimeUnit.MILLISECONDS);
}

四.原生Future方法

//我們需要執行的程式碼1
Future future = longTimeMethod2();
//我們需要執行的程式碼2
Integer result = future.get();

可以看到,我們呼叫longTimeMethod2返回一個Future物件(注意了,這裡的longTimeMethod2當然不是上面的longTimeMethod),然後處理“我們需要執行的程式碼2”,到了需要返回結果的時候直接呼叫future.get()便能獲取到返回值。下面我們來看看longTimeMethod2如何實現。

private Future longTimeMethod2() {
  //建立執行緒池
  ExecutorService threadPool = Executors.newCachedThreadPool();
  //獲取非同步Future物件
  Future future = threadPool.submit(new Callable() {
    @Override
    public Integer call() throwsException {
        return longTimeMethod();
    }
  });
  return future;
}

參考

原文連結:https://www.jianshu.com/p/51f0555b232a

到此這篇關於java非同步呼叫的4種實現方法的文章就介紹到這了,更多相關java非同步呼叫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com