1、什么是線程池? 答: 經常創建、啟動銷毀一個線程都是非常消耗時間的。 使用線程池進行管理和復用線程,提高程序效率。 面試答: Java線程池能帶來的3個好處: 1、降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。 2、提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。 3、提高線程的可管理性。線程是稀缺資源,如果無限制地創建, 不僅會消耗系統資源。還會降低系統的穩定性。 使用線程池可以統一分配、調優和監控,但是要合理利用。 Java使用線程核心走的是ThreadPoolExecutor。(構造函數)
使用線程池的方式: 使用Executor 封裝好的四種線程池類型。 1、newCachodThreadPool創建一個可以緩存線程池,如果線程池長度超過處理需要 ,可靈活回收空閑線程,若無可回收,則新建線程。 2、newFixedThreadPool 創建一個定長的線程池?煽刂凭程最大并發數,超出的 線程會在隊列中等待。 3、newFixedThreadPool 創建一個定長的線程池。 4、newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作 線程來執行任務。
CPU密集、IO密集。
代碼:
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @classDesc: 功能描述:(線程池四種創建方式 newCachedThreadPool 創建可緩存的線程池) * @author: * @Version:v1.0 * @createTime:2018年7月24日 下午2:56:16 */ public class NewCachedThreadPoolDemo { public static void main(String[] args) { // 1、創建可緩存的線程池 可以重復的利用 ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { int temp = i; newCachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp); } }); } } }
顯示結果:本來程序是創建10個線程,這里就創建了7個,說明有3個在復用
代碼:
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @classDesc: 功能描述:(可固定長度的線程池 newFixedThreadPool) * @author:李月 * @Version:v1.0 * @createTime:2018年7月24日 下午3:23:49 */ public class newFixedThreadPoolDemo { public static void main(String[] args) { //快捷鍵 ctrl+2 +F 來創建變量名 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3); for(int i = 0; i < 10; i++) { int temp = i; newFixedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp); } }); } } }
顯示效果:
代碼執行:
package com.leeue; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * * @classDesc: 功能描述:(創建 可定時的線程池) * @author: * @Version:v1.0 * @createTime:2018年7月24日 下午3:40:54 */ public class NewScheduledThreadPoolDemo { public static void main(String[] args) { ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3); for(int i = 0; i < 10; i++) { int temp = i; newScheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp); } }, 3, TimeUnit.SECONDS);//定時3秒后 執行這個線程池 } } }
顯示效果:
代碼:
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @classDesc: 功能描述:(單線程的線程池) * @author: * @Version:v1.0 * @createTime:2018年7月24日 下午3:57:15 */ public class NewSingleThreadScheduledDemo { public static void main(String[] args) { ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { int temp = i; newSingleThreadExecutor.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp); } }); } } }
顯示效果
調用shoutdown()方法。
面試的時候主要談:核心線程池、最大線程數。