持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~
线程池 Executors
上一篇已经介绍了缓存线程池和定长线程池,接下来聊聊单线程线程池和周期性任务定长线程池。
1. 单线程线程池
执行流程
- 判断线程池的那个线程是否空闲
- 空闲则使用
- 不空闲则等待它空闲后再使用
package yanf.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class day11{
/*单线程线程池
**/
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
}
});
}
}
2. 周期性任务定长线程池
执行流程
- 判断线程池是否存在空闲线程;
- 存在则使用;
- 不存在空闲线程,且线程池未满的情况下,则创建线程,并放入线程池中再使用;
- 不存在空闲线程,且线程池已满的情况下 则等待线程池的空闲线程;
- 周期性任务执行时,定时执行。当某个任务触发时,自动执行某任务。
package yanf.thread;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class day11 {
/*
*周期任务 定长线程池
*/
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
//定时执行一次
//参数1:定时执行的任务
//参数2:时长数字
//参数3:2的时间单位 Timeunit的常量指定
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
}
}, 5, TimeUnit.SECONDS); //5秒钟后执行
/*
周期性执行任务
参数1:任务
参数2:延迟时长数字(第一次在执行上面时间以后)
参数3:周期时长数字(没隔多久执行一次)
参数4:时长数字的单位
*/
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
}
}, 5, 1, TimeUnit.SECONDS);
}
}