Java的四种线程池之scheduledThreadPool
一、概念
创建一个定长线程池,支持定时及周期性任务执行。值得注意的是:创建scheduledThreadPool时,不是使用ExecutorService,而是使用ScheduledExecutorService
定时任务所用方法为:schedule(new Runnable(){}, long delay, TimeUnit unit)
周期任务所用的方法为:scheduleAtFixedRate(new Runnable(){}, long initialDelay, long period, TimeUnit unit)
二、Java代码
/*创建一个定长线程池,支持定时及周期性任务执行。*/
public static void scheduledThreadPool() {
//注意创建scheduledThreadPool时,不是使用ExecutorService,而是使用ScheduledExecutorService
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
System.out.println(System.currentTimeMillis());
//schedule延迟执行方法,定时任务。
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("延迟3秒执行。"+Thread.currentThread().getName());
}
}, 3, TimeUnit.SECONDS);
//scheduleAtFixedRate定时执行方法,周期任务
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("延迟1秒后,每3秒执行一次。"+Thread.currentThread().getName());
}
}, 1, 3,TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("延迟1秒后,每4秒执行一次。"+Thread.currentThread().getName());
}
}, 1, 4,TimeUnit.SECONDS);
//10秒后,不再生成新的线程,在工作的线程全部执行完后,再运行下面的操作。
try {
Thread.sleep(10000);
scheduledThreadPool.shutdown();
System.out.println(System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
需要引入的包:
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
总结
![在这里插入图片描述](https://img-blog.csdnimg.cn/87396a25886445babc81495635f0545d.png)从时间戳来看,由63911到73914差不多是10秒的间隔,Thread.sleep(10000)使当前线程沉睡10秒,之后调用线程池的shutdown()方法结束所有线程。
在需要用到定时执行和周期执行时,ScheduledExecutorService比Timer更安全,功能更强大。