ScheduledThreadPool执行延时任务

本文介绍了ScheduledThreadPool在Java并发编程中的应用。通过实例演示了多线程与单线程执行延时任务的区别,展示了如何利用ScheduledExecutorService来调度定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.jd.schdule;

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

/**
 * ScheduledThreadPool执行延时任务
 * 多线程执行多延时任务
 * 单线程执行多延时任务
 * @author yfzhangbin
 */
public class SchduleTest {

	public static void main(String[] args) {
		 ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
		 ScheduledExecutorService singleThread = Executors.newSingleThreadScheduledExecutor();
		 
		 threadPool.schedule(new MyScheduledTask("t1"), 1, TimeUnit.SECONDS);
		 threadPool.schedule(new MyScheduledTask("t2"), 1, TimeUnit.SECONDS);   // t1、t2在多个线程执行t1延时不会影响t2
		 singleThread.schedule(new MyScheduledTask("t3"), 1, TimeUnit.SECONDS);
		 singleThread.schedule(new MyScheduledTask("t4"), 1, TimeUnit.SECONDS); // t3、t4 在同一线程执行t3延时会影响 t4
		 
		 threadPool.shutdown();
		 singleThread.shutdown();
	}

}

class MyScheduledTask implements Runnable {
	
	private String tname;
	
	public MyScheduledTask(String tname) {
		this.tname = tname;
	}

	@Override
	public void run() {
		System.out.println(tname+"任务开始执行");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(tname+"任务执行完毕!!!");
	}
	
}

 输出:

t1任务开始执行
t2任务开始执行
t3任务开始执行
t3任务执行完毕!!!
t4任务开始执行
t2任务执行完毕!!!
t1任务执行完毕!!!
t4任务执行完毕!!!
 
### 创建包含5个线程的调度线程池 在 Java 中,`ScheduledExecutorService` 是 `ExecutorService` 的一个扩展接口,用于支持定时和周期性任务执行。通过 `Executors.newScheduledThreadPool(int corePoolSize)` 方法可以创建一个指定核心线程数的调度线程池[^1]。 下面是一个完整的示例代码展示如何使用 `newScheduledThreadPool` 来创建一个包含 5 个线程的调度线程池,并安排任务在其上运行: ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledThreadPoolExample { public static void main(String[] args) { // 创建一个包含5个线程的调度线程池 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); // 定义一个简单的Runnable任务 Runnable task = () -> System.out.println("Task executed by " + Thread.currentThread().getName()); // 使用schedule方法,在延迟3秒后执行一次任务 scheduledExecutorService.schedule(task, 3, TimeUnit.SECONDS); // 使用scheduleAtFixedRate方法,每隔2秒执行一次任务(首次启动有初始延迟) scheduledExecutorService.scheduleAtFixedRate(() -> System.out.println("Periodic Task at " + System.currentTimeMillis()), 0, 2, TimeUnit.SECONDS); // 关闭线程池的操作通常放在适当的地方以防止资源泄漏 try { Thread.sleep(10000); // 让主线程等待一段时间以便观察任务执行情况 } catch (InterruptedException e) { e.printStackTrace(); } scheduledExecutorService.shutdown(); // 平滑关闭线程池 } } ``` 上述代码展示了两个主要功能: - **一次性任务**:通过 `scheduledExecutorService.schedule()` 方法设置了一个延时 3 秒的任务。 - **周期性任务**:通过 `scheduledExecutorService.scheduleAtFixedRate()` 设置了每两秒钟执行一次的任务[^2]。 当不再需要线程池时,调用 `shutdown()` 或者 `shutdownNow()` 可以释放相关资源并停止所有未完成的任务。 ### 注意事项 为了确保程序能够正常结束而不被阻塞,建议在线程池提交完所有任务后显式地调用其 `shutdown()` 方法来平滑退出线程池。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值