如果对于自定义线程池类以及其中的参数不了解,可以查看我的一篇关于常见三种线程池的讲解
-
自定义线程池的代码展示
public class ThreadPoolDemo { public static void main(String[] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,20, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10) ); for (int i = 0; i < 100; i++) { threadPoolExecutor.execute(new MyTask(i)); } } } class MyTask implements Runnable{ int i = 0; public MyTask(int i) { this.i = i; } @Override public void run() { System.out.println(Thread.currentThread().getName()+"--"+i); try { Thread.sleep(1000L); //业务逻辑 } catch (InterruptedException e) { e.printStackTrace(); } } }
这是一个自定义的线程池,其中设定的核心线程为10,非核心线程也是10,对列是一个数组队列,队列长度也是10,看上面这段代码,猜一下会报什么错。
-
报错错误展示
错误如下图所示:
这是因为任务有100个,而队列加上线程的长度只有30个,所以剩下的任务会被拒绝掉。猜一下该线程池中任务的打印顺序又是什么 -
任务打印顺序
打印顺序如下图:
可以看到先跑完了任务20-29,后面再跑的任务10-19,那为什么是这个顺序呢 -
任务打印顺序原理
根据下图进行讲解
线程的
提交优先级当多个任务在线程池中分配时,首先会到核心线程那里去,当核心进程满了,接着到队列中去,当队列中满了,再到非核心进程中去。
执行优先级
核心线程会先执行任务,接着是非核心线程在执行任务,队列是当核心线程和非核心线程都执行完成后,才会被执行到。
所以,才会出现先任务11-20最后被执行。