线程池ThreadPool:一个是线程的集合,一个是任务的集合指向一个任务队列。
线程池装的是一个个线程执行里边一个个的任务,这个任务放在任务队列里边。
(1)定义ThreadPoolExecutor有7个参数。
分别为:核心线程数、最大线程数、生存时间、时间单位、任务队列、线程工厂(产生线程,线程的名称)、拒绝策略
ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(4), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
运行方式:最开始这个线程池里边没有线程,这时来了一个任务起一个线程因为核心线程数还没到所以不用归还再来一个任务再起一个线程也不用归还,当第三个任务来的时候我的核心线程还忙着呢没空理他,加入任务队列。假如任务队列也满了核心线程也忙着执行拒绝策略。
JDK四种拒绝策略:
Abort:抛异常
Discard:扔掉,不抛异常
DiscardOldest:扔掉排队最长的
CallerRuns:调用者处理任务
拒绝策略JDK默认提供了四种但是可以自定义。
调整线程池的大小,虽然有下面的公司进行计算但是也得需要压力测试得出最终的结果。
(2)ForkJoinPool:分解汇总任务,用很少的线程执行很多的任务(子任务)TPE做不到先执行子任务 CPU密集型