持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~
线程池 Executors
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 系统的效率,因为频繁创建线程和销毁线程需要时间。线程池就是一个容纳多个线程的容器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
线程池实现步骤
- 创建线程
- 创建任务
- 执行任务
- 关闭线程
线程池的好处
- 降低资源消耗。
- 提高响应速度。
- 提高线程的可管理性。
Java中的四种线程池 . ExecutorService
1. 缓存线程池
缓存线程池无限制长度,任务加入后的执行流程:
- 判断线程池是否存在空闲线程
- 存在则使用
- 不存在则创建线程并使用
package yanf.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo13 {
public static void main(String[] args) {
//缓存线程池
//向线程池中加入新的任务
ExecutorService service = Executors.newCachedThreadPool();
//指挥线程池执行新的任务
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() + "锄禾日当午");
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2. 定长线程池
定长线程池是指长度是指定的线程池,加入任务后的执行流程是:
- 判断线程池是否存在空闲线程
- 存在则使用
- 不存在空闲线程 且线程池未满的情况下 则创建线程 并放入线程池中 然后使用
- 不存在空闲线程 且线程池已满的情况下 则等待线程池的空闲线程
package yanf.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo1 {
/*
*定长线程池
*/
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "锄禾日当午");
}
});
}
}