自定义线程池:
public class MyThreadPoolDemo {
/**第一个线程就用核心线程数去执行,第二个线程就放到队列中,因为队列大小是3,所以第二个到第四个任务都放到队列中,第五个任务 * 依然是尝试 放队列,但是队列满了之后,考虑第二个参数,最大线程数-第一个参数,则是 可以新启一个线程的内容数量. * 第六个任务来了.既不能往队列放,也不能启动线程数. 所以第六个线程 则执行 拒绝策略. * 拒绝策略: AbortPolicy 直接抛出异常组织系统正常工作 * CallerRunsPolicy 只要线程池未关闭,改策略直接在调用者线程中.运行当前呗丢弃的任务. * DiscardOldestPolicy:丢弃最老的一个请求,尝试在此提交当前任务. * DiscardPolicy:丢弃无法处理的任务.不给于任何处理. * 如果需要自定义拒绝策略 可以实现 RejectedExecutionHandler接口**/
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(
1, //核心线程数
2, //最大连接数量
60L,//失效时间
TimeUnit.SECONDS,//失效时间单位
new ArrayBlockingQueue(3),//有界队列
LinkedBlockingQueue()//无界队列
new DiscardOldestPolicy(),//拒绝策略.
);
MyTask mt1 = new MyTask(1, "任务1");
MyTask mt2 = new MyTask(2, "任务2");
MyTask mt3 = new MyTask(3, "任务3");
MyTask mt4 = new MyTask(4, "任务4");
MyTask mt5 = new MyTask(5, "任务5");
MyTask mt6 = new MyTask(6, "任务6");
pool.execute(mt1);
pool.execute(mt2);
pool.execute(mt3);
pool.execute(mt4);
pool.execute(mt5);
pool.execute(mt6);
pool.shutdown();
}}