系统不可能无限创建很多的线程,会构建一个线程池,有一定数量的线程,让他们执行各种各样的任务,线程执行完任务之后,不会销毁自己,继续等待执行下一个任务。
频繁的创建线程、销毁线程,会导致开销浪费
ExecutorService threadPool = Executors.newFixedThreadPool(10);//10表示核心线程池数,corePoolSize
threadPool.submit(new Callable(){
public void run(){
}
});
线程池刚创建时,是没有线程的,而且会自带一个空的队列(阻塞队列)
队列可以为无界队列,也可以是有界队列
当前线程数小于核心线程数时,当提交新任务过来后,会创建一个新的线程去执行任务,执行完了就尝试从无界的LinkedBlockingQueue里获取新的任务,如果没有新的任务,此时就会发生阻塞直到线程池里有新的任务。
当前线程数已达到核心线程数时,当提交新任务过来时,会将任务放入阻塞队列中。当有线程执行完任务后,不会直接销毁,而是会争抢获取任务执行。如果所有线程此时都在执行任务,那么无界队列中的任务可能会越来越多。如果阻塞队列是有限的,那么当阻塞队列满了之后,会检查核心线程池是否已满,满了,会创建额外的线程放入线程池中
相对于FixedThreadPool,它的队列LinkedBlockingQueue无界阻塞队列,就是说队列是无限大的。