執行緒池處理Runnable任務
阿新 • • 發佈:2022-11-30
執行緒池如何處理Runnable任務
使用ExecutorService的方法:
void execute(Runnable target)
package com.itheima.d8_threadpool; public class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "輸出了:HelloWorld ==> " + i); } try { System.out.println(Thread.currentThread().getName() + "本任務與執行緒綁定了,執行緒進入休眠了~~~"); Thread.sleep(10000000); } catch (Exception e) { e.printStackTrace(); } } }
package com.itheima.d8_threadpool; import java.util.concurrent.*; /** 目標:自定義一個執行緒池物件,並測試其特性。 */ public class ThreadPoolDemo1 { public static void main(String[] args) { // 1、建立執行緒池物件 /** public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) */ ExecutorService pool = new ThreadPoolExecutor( 3, 5 , 6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); // 2、給任務執行緒池處理。 Runnable target = new MyRunnable(); pool.execute(target); pool.execute(target); pool.execute(target); pool.execute(target); pool.execute(target); pool.execute(target); pool.execute(target); pool.execute(target); // 建立臨時執行緒 pool.execute(target); pool.execute(target); // // 不建立,拒絕策略被觸發!!! // pool.execute(target); // 關閉執行緒池(開發中一般不會使用)。 // pool.shutdownNow(); // 立即關閉,即使任務沒有完成,會丟失任務的! pool.shutdown(); // 會等待全部任務執行完畢之後再關閉(建議使用的) } }
一共最大5個執行緒 當有3個執行緒 pool.execute(target); 執行的業務程式碼的時候。執行緒數量是3
此時再新增5個執行緒 pool.execute(target); 執行的業務程式碼的時候 因為還沒有達到最大佇列數5 所以此時執行緒數量仍然是3
此時再新增1個執行緒 開始 建立臨時執行緒。 因為臨時執行緒數量最大為2
當臨時執行緒超過2的時候 開始拒絕策略