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

Java 實現非同步呼叫

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

廢話不多說 上程式碼

public class MyExecutor {

    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("報錯啦!!");

                    }

                }

        });

    }

}

public class Demo{

    public static void main(String[] args) {

         MyExecutor  myExecutor = new MyExecutor();

         try {

            myExecutor.fun();

            System.our.print("你先睡著,我先回家啦~");

        }catch(Exception e) {

             throw new RuntimeException("業務程式報錯啦!!");

        }

    }

}

好啦 程式碼到此結束 (ps:純手打 若有錯 請見諒) 

執行主方法 

會先列印(你先睡著,我先回家啦~)

然後(睡夠啦~)

也就是說 在需要非同步執行的方法未執行完畢時 主程式已經返回結果了  不需要繼續等待 這樣可以保證程式先返回結果 再繼續執行不需要等待的繁瑣的任務  當然也可以加一些方法去判斷非同步方法是否執行完畢。

說一下Executors類

這個類是用來建立執行緒池的

有這麼幾個方法

1、newFixedThreadPool() 建立固定大小的執行緒池 執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒

2、newCachedThreadPool() 建立一個可快取的執行緒池,如果執行緒池的大小超過了處理任務所需要的執行緒,那麼就會回收部分空閒(60s不執行任務)的執行緒,當任務數量增加時,此執行緒池又可以智慧的新增新執行緒來處理任務。此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於系統(JVM)能夠建立的最大執行緒大小

3、newSingleThreadExecutor() 建立一個單執行緒的執行緒池。這個執行緒池只有執行緒在工作,也就是相當於單執行緒序列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有一個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行

4、newScheduledThreadPool() 建立一個大小無限的執行緒池,此執行緒池支援定時以及週期性執行任務的需求

5、newSingleThreadScheduledExecutor() 建立一個單執行緒的執行緒池。此執行緒池支援定時以及週期性執行任務的需求