CachedThreadPool的建立方式java
ExecutorService executorService = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
SynchronousQueue有2個方法須要注意,put和offer,put方法分狀況來講:假設線程A正在waiting 從SynchronousQueue取一個元素,此時put(e),則e會被A接走,put會立刻返回;假設沒有線程正在waiting從SynchronousQueue取一個元素,此時put(e),則put(e)會阻塞當前的線程。put的特色是若是沒有線程在waiting從SynchronousQueue取元素,則put(e)會阻塞當前線程。spa
offer方法分狀況來講:假設線程A正在waiting 從SynchronousQueue取一個元素,此時offer(e),則e會被A接走,offer返回true;假設沒有線程正在waiting從SynchronousQueue取一個元素,此時offer(e),則offer(e)不會阻塞當前的線程,會立刻返回,且返回false。offer特色是若是沒有線程在waiting從SynchronousQueue取元素,則offer(e)不會阻塞當前線程。線程
JDK的ThreadPoolExecutor的execute方法代碼以下(若是不理解,建議先看下JDK中ThreadPoolExecutor的源碼,理解工做原理)。若是提交的Runnable執行耗時較長,那麼多數狀況下沒有waiting to receive的線程,因此圖1中第二個紅框處的workQueue.offer(command) 會立刻返回false,因此會進入第三個紅框處,即在線程池中新增線程。這就是爲何若是咱們提交的Runnable執行耗時較長,則會出現不少的線程,如圖2所示。code
圖1 JDK中ThreadPoolExecutor的execute(...)源碼源碼
圖2 設置每一個Runnable中睡眠700毫秒,則線程池建立了10個線程it
使用場景:JDK的註釋上說,用於short-lived task,這中線程池我在不少源碼中看見過。class
缺點:線程池中會出現大量的線程。原理