全部评论
线程池设计时是这么考虑的:当任务对列没有满时,如果线程池中线程个数小于核心线程数,那么新加任务进来时,创建新的线程,并把新任务设为worker的firstTask,由新创建的线程直接执行。线程池的Worker重写了run方法,当线程调用run方法时,执行runWorker方法,此时线程会进去一个while循环不断getTask,意味着如果有新任务添加进来都会被在while里面循环的线程执行。如果线程达到核心线程数,且任务队列没有满,新添加进来的任务会被池里任意空闲的线程执行。如果工作队列满了,说明线程池的工作线程已经达到了核心数目,那么就需要创建新的线程,新任务为新线程的firstTask....
不知道理解有没有错。。。😳
如果当前线程池线程数小于核心线程数的话,会直接创建线程执行到达的任务;如果线程池线程数大于核心线程数小于最大线程数,并且任务队列是synchronousQueue的话,也会创建线程直接执行到达的任务。
这个不是考的线程池如何复用线程么?是限时时间的无限循环,限时的实现:google的实现方式是阻塞队列的poll(),无限循环在线程的代码里面就是getTask()。 两者的结合过程是这样:多个空闲线程通过getTask()无限循环阻塞队列,若未取得队列中的任务,会调用阻塞队列的方法poll(long timeout, TimeUnit unit),含义就是阻塞队列等待timeout若没有任务,该空间线程再退出。如果在0-timeout时间内有任务来到,此时,空闲线程就能直接执行任务,由于是阻塞队列,所以是线程安全的。只会有一个线程争抢到任务
阻塞队列的take方法里面还是reentrantlock的condition来实现生产者消费者模型的,默认是非公平锁,有可能是有个线程刚刚执行完任务,然后任务就来了,这个线程立刻获得任务直接执行,还有一种是所有线程都在等待,那就先进入condition等待队列的首部线程被唤醒进入aqs同步队列获取锁继续执行任务。
啥叫又来一个任务队列
很菜的我也被问过。个人理解是,如果核心池没满,不管有没有空闲线程都在核心池创建一个新线程运行任务,如果核心池满了且核心池有空闲线程就把该任务交给核心池的空闲任务
空闲线程应该是在任务队列的take方法上阻塞的,如果新来一个任务的话应该是谁抢到锁谁执行。
相关推荐