java并發(fā)ScheduledThreadPoolExecutor詳解

小億
80
2024-01-02 16:13:38

ScheduledThreadPoolExecutor是一種繼承自ThreadPoolExecutor的線程池,它可以在給定的時(shí)間間隔內(nèi)周期性地執(zhí)行任務(wù)。它是Java并發(fā)包中提供的一個(gè)用于調(diào)度任務(wù)的線程池。

ScheduledThreadPoolExecutor的主要特點(diǎn)如下:

  1. 可以創(chuàng)建一定數(shù)量的線程來(lái)執(zhí)行任務(wù),這些線程可以重復(fù)使用,避免了每次執(zhí)行任務(wù)都需要?jiǎng)?chuàng)建和銷毀線程的開(kāi)銷。
  2. 可以按照一定的時(shí)間間隔來(lái)調(diào)度任務(wù)的執(zhí)行,可以設(shè)定任務(wù)的延遲執(zhí)行時(shí)間和周期執(zhí)行時(shí)間。
  3. 可以設(shè)定任務(wù)的優(yōu)先級(jí),高優(yōu)先級(jí)的任務(wù)會(huì)優(yōu)先執(zhí)行。
  4. 可以設(shè)定任務(wù)的超時(shí)時(shí)間,如果任務(wù)執(zhí)行時(shí)間超過(guò)了設(shè)定的超時(shí)時(shí)間,任務(wù)會(huì)被中斷。
  5. 可以設(shè)定任務(wù)的拒絕策略,當(dāng)線程池?zé)o法執(zhí)行新的任務(wù)時(shí)如何處理。

ScheduledThreadPoolExecutor的使用步驟如下:

  1. 創(chuàng)建一個(gè)ScheduledThreadPoolExecutor實(shí)例,可以使用ScheduledThreadPoolExecutor的構(gòu)造方法或者工廠方法來(lái)創(chuàng)建。
  2. 創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable或Callable接口的任務(wù)。
  3. 調(diào)用ScheduledThreadPoolExecutor的schedule()方法或scheduleAtFixedRate()方法來(lái)提交任務(wù),設(shè)定任務(wù)的延遲執(zhí)行時(shí)間和周期執(zhí)行時(shí)間。
  4. 如果需要取消任務(wù)的執(zhí)行,可以調(diào)用ScheduledFuture的cancel()方法。

下面是一個(gè)示例代碼,演示了如何使用ScheduledThreadPoolExecutor來(lái)調(diào)度任務(wù)的執(zhí)行:

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

public class ScheduledThreadPoolExecutorExample {

    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)ScheduledThreadPoolExecutor實(shí)例,最多同時(shí)執(zhí)行2個(gè)任務(wù)
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);

        // 創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable接口的任務(wù)
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("Task is running");
            }
        };

        // 調(diào)用scheduleAtFixedRate()方法來(lái)提交任務(wù),設(shè)定任務(wù)的延遲執(zhí)行時(shí)間和周期執(zhí)行時(shí)間
        executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);

        // 運(yùn)行一段時(shí)間后關(guān)閉線程池
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executor.shutdown();
    }
}

上述代碼中,創(chuàng)建了一個(gè)最多同時(shí)執(zhí)行2個(gè)任務(wù)的ScheduledThreadPoolExecutor實(shí)例,然后創(chuàng)建了一個(gè)實(shí)現(xiàn)Runnable接口的任務(wù),最后調(diào)用scheduleAtFixedRate()方法來(lái)提交任務(wù),設(shè)定任務(wù)的延遲執(zhí)行時(shí)間為0,周期執(zhí)行時(shí)間為1秒。然后運(yùn)行了5秒后關(guān)閉線程池。

通過(guò)ScheduledThreadPoolExecutor可以靈活地調(diào)度任務(wù)的執(zhí)行,可以將任務(wù)按照一定的時(shí)間間隔周期性地執(zhí)行,非常適合需要定時(shí)執(zhí)行任務(wù)的場(chǎng)景。

0