首頁 > 軟體

java多執行緒開發ScheduledExecutorService簡化方式

2022-03-08 13:03:56

前言

java開發,多多少少會接觸到多執行緒的應用開發場景,博主之前做多執行緒的時候就兩種方式,一個是繼承Thread一個是實現Runnable介面,不過用的多的還是實現Runnable介面,因為實現Runnable介面可以做多執行緒資源共用!而java.util.concurrent.ScheduledExecutorService介面將大大簡化多執行緒應用的開發!也能輕鬆解決任務定時執行的問題!

java多執行緒的應用場景

應用場景一:

做過微信開發的都知道,微信的token是有失效時間的,而且每天獲取token都是有限制的,不能每次需要的時候取一次,只能快過期的時候重新去取,這個時候我們就可以給取token的這個操作單獨開個執行緒,每次取完後執行緒休眠一段繼續去取,這樣就保證了token永遠都是有效的 !    

應用場景二:

同樣是微信開發中的問題,微信伺服器連我們伺服器的時候,必須五秒內響應結果,不然微信就直接提示使用者,該服務不可用了。而我們不可能所有的業務都能做到五秒內完成並響應微信伺服器。比如從微信伺服器上下載使用者提交的檔案儲存到我們自己的檔案伺服器上,(微信伺服器臨時儲存使用者檔案),檔案的上傳下載都是比較耗時的操作,我們肯定不能等檔案上傳完了在響應微信,所有得單獨開個執行緒還執行檔案的下載上傳操作 

ScheduledExecutorService方法簡介

/**
     *指定delay時間後執行任務
     * @param command 執行的執行緒任務 Runnable不能返回執行結果
     * @param delay 指定某個時間後執行
     * @param unit 指定時間單位
     * @return
     */
    public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) {
        return null;
    }
    /**
     *指定delay時間後執行任務
     * @param callable 執行的執行緒任務 Callable返回執行結果
     * @param delay 指定某個時間後執行
     * @param unit 指定時間單位
     * @param
     * @return
     */
    publicScheduledFutureschedule(Callablecallable, long delay, TimeUnit unit) {
        return null;
    }
    /**
     *等待initiaDelay時間後,每個period時間執行一次
     * @param command
     * @param initialDelay
     * @param period
     * @param unit
     * @return
     */
    public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
        return null;
    }
    //scheduleWithFixedDelay和scheduleAtFixedRate差不多
    public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
        return null;
    }

範例

/**
 * @author kl by 2016/5/14
 * @boke www.kailing.pub
 */
public class Test  {
    public static int count=0;
    public static void main(String[] args) {
        //初始化兩個線城池大小的任務排程服務
        ScheduledExecutorService executorService= Executors.newScheduledThreadPool(2);
        //任務一:0秒後開始執行,之後每秒執行一次
        final ScheduledFuture test1= executorService.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println("任務一執行第"+(count++)+"次   "+Thread.currentThread());
            }
        },0, 1,TimeUnit.SECONDS);

        //任務二:6秒後開始執行,並返回執行結果
       final   ScheduledFuture test2 = executorService.schedule(new Callable() {
            public Object call()  {
                System.out.println("任務二執行,傳遞執行結果給任務三  "+Thread.currentThread());
                return "任務二已執行完,請知曉!";
            }
        },6,TimeUnit.SECONDS);

        //任務三:8秒後執行,列印任務二的結果,終止任務一
        executorService.schedule(new Runnable() {
            public void run() {
                try {
                    System.out.println(test2.get());
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("任務三執行,任務一終止  "+Thread.currentThread());
               test1.cancel(true);
            }
        },8,TimeUnit.SECONDS);

        System.out.println("我是最先執行的嗎?不一定,雖然我是主執行緒  "+Thread.currentThread());
    }
}

ps:因為任務三種涉及了任務二的執行結果,所以即使任務三的執行時間設定在任務二的執行前面,任務三也要等到任務二執行完後才能執行 ,這個可以修改執行時間自己測試測試,體會體會

範例結果

以上就是java多執行緒開發ScheduledExecutorService簡化方式的詳細內容,更多關於java多執行緒開發ScheduledExecutorService簡化的資料請關注it145.com其它相關文章!


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