/** * corePoolSize:核心线程数 * maximumPoolSize:最大线程数 * keepAliveTime:线程的空闲时间 * TimeUnit unit:时间单位 * workQueue:工作队列 * ThreadFactory:线程工厂 * RejectedExecutionHandler handler:拒绝策略 * AbortPolicy:拒绝任务并抛弃异常 * CallerRunsPolicy:由调用者来执行 * DiscardOldestPolicy:把新任务加入,丢弃最早的任务 * DiscardPolicy:直接丢弃,什么也不做 * * 线程池的工作流程 * 1.最开始的时候,线程池是空的 * 2.随着任务的提交,开始创建线程 * 1>if(当前线程数 < corePoolSize),创建线程 * 2>if(当前线程数 = corePoolSize),把任务添加到工作队列中 * 3>队列满了,if(当前线程 < maxPoolSize),创建线程 * 4>队列满了,if(当前线程数 == maxPoolSize),执行拒绝策略 * 3.随着任务的执行,剩余任务主键减少,逐渐有了空闲的线程 * if(空闲时间 > keepAliveTime,且当前线程数 > corePoolSize),销毁线程,知道当前线程数 == corePoolSize * * 常见的线程池:
FixedThreadPool | 核心线程数与最大线程数相同 |
SingleThreadExecutor | 一个线程的线程池 |
CachedThreadPool | 核心线程为0,最大线程数为Integer. MAX_VALUE |
ScheduledThreadPool | 指定核心线程数的定时线程池 |
SingleThreadScheduledExecutor | 单例的定时线程池 |
ForkJoinPool | JDK 7 新加入的一种线程池 |
* * 自己创建线程池: * 1.线程 * 2.有一个保存线程的容器 * 3.任务 * 4.队列 * 5.需要提供一个方法,往线程池里添加任务 */ import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class Worker extends Thread{ BlockingQueue<Runnable> queue = null; public Worker(BlockingQueue<Runnable> queue){ this.queue = queue; } public void run() { //扫描任务队列, 并执行 while (true){ try { Runnable runnable = queue.take(); runnable.run(); }catch (Exception e){ e.printStackTrace(); } } } } public class MyThreadPool { BlockingQueue<Runnable> queue = new LinkedBlockingQueue(); List<Worker> workerList = new ArrayList<>(); public MyThreadPool(int corePoolSize){ for (int i = 0; i < corePoolSize; i++) { Worker worker = new Worker(queue); worker.start(); workerList.add(worker); } } public void submit(Runnable runnable){ try { queue.put(runnable); } catch (InterruptedException e) { e.printStackTrace(); } } }
测试代码
import java.util.Date; public class MyThreadPool_Test { public static void main(String[] args) { MyThreadPool pool = new MyThreadPool(3);//调用自己创建的线程池 for (int i = 0; i < 10; i++) { pool.submit(() -> { System.out.println("hello" + new Date()); try { //处理异常 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } } }