计算机系统应用教程网站

网站首页 > 技术文章 正文

Java并发编程(5):Executor框架 - ScheduledThreadPool

btikc 2024-11-21 10:54:10 技术文章 20 ℃ 0 评论

newScheduledThreadPool 是 Executors 类提供的一个工厂方法,用于创建一个可以延迟执行或定期执行任务的线程池。这个线程池非常适合执行定时任务,如调度作业、周期性检查等。

以下是一个使用 newScheduledThreadPool 的例子,该例子展示了如何安排任务在将来某个时间点执行,以及如何安排任务定期执行:

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

public class ScheduledThreadPoolExample {

    public static void main(String[] args) {
        // 创建一个包含4个线程的计划线程池
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(4);

        // 安排一个任务在10秒后执行
        scheduledExecutorService.schedule(() -> {
            System.out.println("这个任务在10秒后执行,线程:" + Thread.currentThread().getName());
        }, 10, TimeUnit.SECONDS);

        // 安排一个任务定期执行,每5秒执行一次
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("这个任务每5秒执行一次,线程:" + Thread.currentThread().getName());
        }, 0, 5, TimeUnit.SECONDS);

        // 安排一个任务在初始延迟后,按指定周期重复执行
        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            System.out.println("这个任务在延迟后每3秒执行一次,线程:" + Thread.currentThread().getName());
        }, 3, 3, TimeUnit.SECONDS);

        // 为了示例的完整性,等待一段时间,让任务有机会执行
        try {
            Thread.sleep(40 * 1000); // 等待40秒
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // 关闭线程池,不再接受新任务,等待现有任务完成
        scheduledExecutorService.shutdown();
    }
}

在这个例子中,我们首先创建了一个包含4个线程的计划线程池。然后,我们安排了三个任务:

  • 单次执行任务:使用 schedule 方法安排一个任务在10秒后执行。
  • 固定频率执行任务:使用 scheduleAtFixedRate 方法安排一个任务每5秒执行一次。
  • 固定延迟执行任务:使用 scheduleWithFixedDelay 方法安排一个任务在初始延迟3秒后执行,之后每3秒重复执行一次。

在安排完任务后,我们在主线程中等待40秒,以确保任务有机会执行。最后,我们调用 shutdown 方法来关闭线程池,这表示不再接受新任务,并等待现有任务完成。

请注意,实际应用中可能需要更精细地管理线程池的生命周期,以确保资源被正确释放。此外,ScheduledExecutorService 提供的定时任务执行并不保证严格的执行时间间隔,如果任务执行时间较长,可能会影响后续任务的调度。

以上代码输出:

这个任务每5秒执行一次,线程:pool-1-thread-1
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-2
这个任务每5秒执行一次,线程:pool-1-thread-3
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-1
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-1
这个任务每5秒执行一次,线程:pool-1-thread-2
这个任务在10秒后执行,线程:pool-1-thread-3
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-4
这个任务每5秒执行一次,线程:pool-1-thread-1
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-2
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-2
这个任务每5秒执行一次,线程:pool-1-thread-1
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-3
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-3
这个任务每5秒执行一次,线程:pool-1-thread-2
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-1
这个任务每5秒执行一次,线程:pool-1-thread-4
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-3
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-3
这个任务每5秒执行一次,线程:pool-1-thread-4
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-2
这个任务在延迟后每3秒执行一次,线程:pool-1-thread-2
这个任务每5秒执行一次,线程:pool-1-thread-4

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表