目录
四. ThreadPoolExecutor的构造方法及参数理解
2. int maximumPoolSize: 最大线程数 = 核心线程数 + 非核心线程数
3. int keepAliveTime:非核心线程允许空闲的最大时间.
4. BlockingQueue workQueue: 工作队列.
5. ThreadFactory threadFactory: 工厂模式
6. RejectedExecutionHandle handle: 拒绝策略. (最重要)
一. 什么是线程池
线程池是一种并发处理机制, 它预先创建一定数量的线程, 并按照一定的策略管理和组织这些线程, 当有任务需要执行时, 线程池会从空闲线程中取出一个线程来执行任务, 执行完毕后, 这个线程又重新回到线程池中, 等待下一轮分配.
二. 线程池的作用
避免频繁的创建和销毁线程, 减少资源消耗.
三. java提供的线程池类
四. ThreadPoolExecutor的构造方法及参数理解
五. 线程池的核心方法
submit(Runnable): 通过Runnable来描述一段任务, 使用submit将这段任务提交到线程池中, 线程池再分配空闲线程来执行这段任务.
六. 创建线程池的简化代码
ExecutorService executorService = Executors.newFixedThreadPool(4);
Executors.newFixedThreadPool(nThreads); // 最大线程数和核心线程数一样.(创建固定线程数目的线程池)
ExecutorService executorService = Executors.newCachedThreadPool();
最大线程数是一个很大的数字. (线程池中的线程数可以增加)
七. 模拟实现线程池
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
class MyThreadPool {
BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<>(10);
public MyThreadPool(int n) {
// 创建固定线程数量的线程池
// 创建n个线程
for (int i = 0; i < n; i++) {
Thread thread = new Thread(() -> {
try {
while (true) {
Runnable runnable = blockingQueue.take();
runnable.run();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
// System.out.println(n);
}
}
public void submit(Runnable runnable) throws InterruptedException {
blockingQueue.put(runnable);
}
}
public class demo4 {
static int count = 0;
public static void main(String[] args) throws InterruptedException {
MyThreadPool myThreadPool = new MyThreadPool(4);
for (int i = 0; i < 100; i++) {
myThreadPool.submit(() -> {
System.out.println(Thread.currentThread().getName() + " count " + count);
});
}
}
}