Java并發(fā)編程高級(jí)篇(六):在執(zhí)行器中延時(shí)執(zhí)行任務(wù)

執(zhí)行器框架提供了ThreadPoolExecutor類來執(zhí)行Runnable和Callable任務(wù)。當(dāng)任務(wù)被發(fā)送給執(zhí)行器的時(shí)候,執(zhí)行器會(huì)根據(jù)俄配合盡可能快地執(zhí)行任務(wù)。但是如果我們不想讓任務(wù)馬上執(zhí)行,而是想讓任務(wù)過一段時(shí)間后再執(zhí)行,或者周期性地執(zhí)行,該怎么辦呢。為了達(dá)到這個(gè)目的,執(zhí)行器框架為我們提供了ScheduledThreadPoolExecutor類。

下面我們看一下如何使用這個(gè)類來實(shí)現(xiàn)延遲執(zhí)行任務(wù)。

首先我們創(chuàng)建一個(gè)任務(wù)類,實(shí)現(xiàn)Callable接口,泛型類型為String。這個(gè)任務(wù)在控制臺(tái)打印執(zhí)行時(shí)間,并返回Hello World。

import java.util.Date;
import java.util.concurrent.Callable;

/**
 * 新建Task類并實(shí)現(xiàn)Callable<String>接口
 *
 * 打印當(dāng)前任務(wù)名+執(zhí)行時(shí)間
 *
 * Created by hadoop on 2016/11/3.
 */
public class Task implements Callable<String> {
    private String name;

    public Task(String name) {
        this.name = name;
    }

    @Override
    public String call() throws Exception {
        System.out.printf("%s: Starting at : %s\n", name, new Date());
        return "Hello World!";
    }
}

接下來我們實(shí)現(xiàn)主類main方法。首先通過執(zhí)行器工廠Executors類的newScheduledThreadPool()方法來創(chuàng)建一個(gè)定時(shí)執(zhí)行器,這個(gè)方法接收一個(gè)參數(shù)作為線程池最大線程數(shù)。接下來創(chuàng)建5個(gè)線程,并調(diào)用schedule方法來執(zhí)行線程,每個(gè)線程都給定一個(gè)延遲執(zhí)行時(shí)間,每個(gè)線程的延遲時(shí)間都間隔一秒。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 在執(zhí)行器中延遲執(zhí)行任務(wù)
 *
 * 我們把任務(wù)發(fā)送給執(zhí)行器框架,任務(wù)會(huì)馬上執(zhí)行,如果你想讓任務(wù)在過一段時(shí)間后才執(zhí)行,那么你需要使用ScheduledThreadPoolExecutor。
 *
 * 創(chuàng)建五個(gè)任務(wù),使用ScheduledThreadPoolExecutor的schedule(Callable<V> callable,long delay,TimeUnit unit)方法來執(zhí)行。
 * 這個(gè)方法接受三個(gè)參數(shù)(實(shí)現(xiàn)Callable接口的任務(wù),延遲執(zhí)行時(shí)間,時(shí)間單位)
 *
 * 如果需要執(zhí)行任務(wù)執(zhí)行的時(shí)間點(diǎn),那么你需要計(jì)算當(dāng)前時(shí)間與任務(wù)執(zhí)行時(shí)間之間的時(shí)間間隔。
 *
 * Created by hadoop on 2016/11/3.
 */
public class Main {
    public static void main(String[] args) throws InterruptedException {
        ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(1);

        for (int i = 1; i <= 5; i++) {
            Task task = new Task(String.valueOf(i));
            executor.schedule(task, i, TimeUnit.SECONDS);
        }

        executor.shutdown();

        executor.awaitTermination(1, TimeUnit.DAYS);
    }
}

執(zhí)行結(jié)果,可以看到每個(gè)任務(wù)都比上一個(gè)任務(wù)延遲一秒執(zhí)行。

1: Starting at : Sat Feb 25 21:38:49 CST 2017
2: Starting at : Sat Feb 25 21:38:50 CST 2017
3: Starting at : Sat Feb 25 21:38:51 CST 2017
4: Starting at : Sat Feb 25 21:38:52 CST 2017
5: Starting at : Sat Feb 25 21:38:53 CST 2017
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容