Executor框架提供了ThreadPoolExecutor类,来使用一个线程池去处理Callable或者Runnable类型的任务,因此用户不用再关注任何与线程创建相关的操作 。当提交一个任务给执行器时,它会根据执行器配置尽快执行 。但是有可能你不需要尽快执行提交的任务,而是想要在一段时间后执行任务或是周期性地执行任务 。基于以上需求,Executor框架提供了ScheduledExecutorService接口和它的实现类ScheduledThreadPool- Executor类 。
本章介绍创建ScheduledExecutorService接口的方法,以及在给定时间之后用它来调度任务执行的方法 。
【如何设置定时开关机 怎么设置定时开关机】import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*
* @Author wj
* @Description定时启动线程
* @Date 13:45 2022/5/30
**/
public class ExecutableTask implements Callable<String> {
private final String name;
public ExecutableTask(String name) {
this.name = name;
}
/**
* @Author wj
* @Description 实现call()方法 。在控制台打印日志记录的实际时间并返回其他文本,如「Hello,world”:
* @Date 11:23 2022/5/30
**/
@Override
public String call() throws Exception {
System.out.printf("%s: Starting at : %s\\n", name, new Date());
return "Hello, world";
}
public static void main(String[] args) {
//创建延迟线程池
ScheduledExecutorService executor = Executors
.newScheduledThreadPool(1);
System.out.printf("Main: Starting at: %s\\n", new Date());
for (int i = 0; i < 5; i++) {
ExecutableTask task = new ExecutableTask("Task " + i);
executor.schedule(task, i + 1, TimeUnit.SECONDS);
}
//调用shutdown()方法关闭执行器
executor.shutdown();
try {
//调用执行器的awaitTermination()方法等待全部任务结束
executor.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Main: Ends at: %s\\n", new Date());
}
}结果分析
本案例的核心在于Main类和ScheduledThreadPoolExecutor的管理 。Java 推荐用ExThreadPoolExecutor类来创建一个ThreadPoolExecutor类型的scheduled执行器 。在本案例中,我们调用了newScheduledThreadPool()方法,并传入数字 1 作为该方法的参数 。该参数代表着预设线程池中的线程数量 。
为了在一段时间后可在Scheduled执行器中执行任务,我们需要使用schedule()方法 。该方法接收如下 3 个参数 。
想要执行的任务 。在任务执行前需等待的时间间隔 。时间间隔的单位,这里为一个TimeUnit类的常量 。
在本案例中,每个任务等待的秒数(TimeUnit.SECONDS)都为该任务在数组中的位置 +1 。
如果想要在某个指定时刻执行任务,则需要计算当前时间与给定时刻的时间间隔,并将该时间间隔设置为任务的延迟时间 。
下图展示了执行本例中一个任务后的输出结果:
可以看到任务间隔 1s 后逐个启动 。所有任务同时提交给执行器,但是每个任务都在上个任务启动 1s 后才启动 。
其他说明
也可以用Runnable接口来实现任务,因为ScheduledThreadPoolExecutor类的schedule()方法可以接受两种类型的任务 。虽然ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的一个子类,但 Java 仍然推荐只在处理延迟或周期性任务时使用ScheduledThreadPoolExecutor类 。
推荐阅读
- 今日铬铁价格长江行情
- 如何去除衣服上的咖啡渍
- 如何正确选购洗衣机 洗衣机哪个牌子好
- 海信激光电视的质量怎么样 其优缺点如何
- 碘伏过期后如何处理
- 冰箱温度如何调节最合适 冰箱温度如何调节
- 数码软件产品教程:怎么关闭华为p30口袋音量大如何关闭口袋模式
- 雪花鸡柳如何炸
- 饮水机漏水怎么回事 如何解决饮水机漏水问题
- 3d液晶电视如何选购 实用小技巧分享