线程池
线程池7个关键词
- 核心线程数
- 最大线程数
- 任务队列: 有界队列(列表) / 无界队列(链表)
- 拒绝策略 / 饱和策略
- 闲置时间
- 时间单位
- 线程工厂
线程池作用:优化创建线程和销毁线程的时间.
普通线程数 = 最大线程数 - 核心线程数
普通线程和核心线程的区别:
- 在执行任务时没有区别
- 一般情况下, 到达闲置时间之后, 会回收普通线程
指定线程个数的线程池容易造成内存溢出的错误, 一直向单向链表中提交内容, 容易造成内存溢出.
任务类
public class Task implements Runnable{
private int num;
public Task(int num) {
this.num = num;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "处理了第" + num + "个任务");
}
}
Java 自带线程池–创建单个任务的线程池
pool-1-thread-1:
当前项目中的第一个线程池中的第一个线程
底层是一个死循环, 会一直监听任务, 项目不会自动关闭, 需要使用 pool.shutdown(); 关闭线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test01 {
/*
知识点: Java 自带的线程池
*/
public static void main(String[] args) {
// 获取单个线程的线程池, 线程池中只有一个线程
ExecutorService pool = Executors.newSingleThreadExecutor();
// 循环创建任务对象, 并提交给线程池
for (int i = 0; i <= 100; i++) {
// 创建任务对象
Task task = new Task(i);
// 提交任务
pool.execute(task);
}
// 关闭线程池
pool.shutdown();
}
}
Java 自带线程池, 获取指定线程个数的线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test01 {
/*
知识点: Java自带线程池 获取指定线程个数的线程池
*/
public static void main(String[] args) {
// 获取指定线程个数的线程池,
ExecutorService pool = Executors.newFixedThreadPool(4);
// 循环创建任务对象, 并提交给线程池
for (int i = 0; i <= 100; i++) {
Task task = new Task(i);
pool.execute(task);
}
pool.shutdown();
}
}
Java自带的线程池 – 获取延迟任务的线程池
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Task01 {
public static void main(String[] args) throws InterruptedException{
// 获取延迟任务的线程池
ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
// 设置延迟时间(时间, 时间单位)
pool.awaitTermination(6, TimeUnit.SECONDS);
// 循环创建任务对象, 并将任务对象提交到线程池
for (int i = 0; i < 100; i++) {
// 创建任务对象
Task task = new Task(i);
// 提交任务到线程池
pool.execute(task);
}
// 关闭线程池
pool.shutdown();
}
}
Java自带线程池–可以缓存的线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test01 {
/*
创建可以缓存
*/
public static void main(String[] args) {
// 创建可以缓存的线程池, 超过 60s 没有工作的线程池会被杀死
ExecutorService pool = Executors.newCachedThreadPool();
// 循环创建任务对象, 并提交给线程池
for (int i = 0; i <= 100; i++) {
// 创建任务对象
Task task = new Task(i);
// 线程池提交任务
pool.execute(task);
}
// 关闭线程池
pool.shutdown();
}
}