失效鏈接處理 |
線程池原理-ThreadPoolExecutor PDF 下載
本站整理下載:
提取碼:iwg5
相關截圖:
![]() 主要內容:
創建線程池 ExecutorService service = Executors.newFixedThreadPool(1); 1.構造方法及參數 public ThreadPoolExecutor( int corePoolSize, //核心線程數 int maximumPoolSize, //最大線程數 long keepAliveTime, //空閑超時時間 TimeUnit unit, //時間單位 BlockingQueue<Runnable> workQueue, //工作隊列 ,阻塞對列 ThreadFactory threadFactory, //線程工廠 RejectedExecutionHandler handler //拒絕策略 ) { } 2.阻塞對列: BlockingQueue<Runnable> 在新增的Concurrent包中,BlockingQueue很好的解決了多線程中,如何高效安全“傳輸”數據的問題。通過 這些高效并且線程安全的隊列類,為我們快速搭建高質量的多線程程序帶來極大的便利。 BlockingQueue的核心方法 public interface BlockingQueue<E> extends Queue<E> { //將給定元素設置到隊列中,如果設置成功返回true, 否則返回false。如果是往限定了長度的隊列中設 置值,推薦使用offer()方法。 boolean add(E e); //將給定的元素設置到隊列中,如果設置成功返回true, 否則返回false. e的值不能為空,否則拋出空指 針異常。boolean offer(E e); //將元素設置到隊列中,如果隊列中沒有多余的空間,該方法會一直阻塞,直到隊列中有多余的空間。 void put(E e) throws InterruptedException; //將給定元素在給定的時間內設置到隊列中,如果設置成功返回true, 否則返回false. boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException; //從隊列中獲取值,如果隊列中沒有值,線程會一直阻塞,直到隊列中有值,并且該方法取得了該值。
E take() throws InterruptedException; //在給定的時間里,從隊列中獲取值,時間到了直接調用普通的poll方法,為null則直接返回null。 E poll(long timeout, TimeUnit unit) throws InterruptedException; //獲取隊列中剩余的空間。 int remainingCapacity(); //從隊列中移除指定的值。 boolean remove(Object o); //判斷隊列中是否擁有該值。 public boolean contains(Object o); //將隊列中值,全部移除,并發設置到給定的集合中。 int drainTo(Collection<? super E> c); //指定最多數量限制將隊列中值,全部移除,并發設置到給定的集合中。 int drainTo(Collection<? super E> c, int maxElements); } 3.線程工廠: DefaultThreadFactory 線程創建有兩種方式 繼承類Thread 實現 Runnable //這里通過Runnable形式創建 static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; DefaultThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "pool‐" + poolNumber.getAndIncrement() + "‐thread‐"; }public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t;
} } 4.拒絕策略: RejectedExecutionHandler //默認為中止策略 private static final RejectedExecutionHandler defaultHandler = new AbortPolicy(); 四種線程池拒絕策略 1.AbortPolicy中止策略 2.DiscardPolicy拋棄策略 3.DiscardOldestPolicy拋棄舊任務策略 4.CallerRunsPolicy調用者運行 當然也可以自定義線程池策略 implements RejectedExecutionHandler //AbortPolicy:飽和時會拋出RejectedExecutionException(繼承自RuntimeException),調用者可 捕獲該異常自行處理 public static class AbortPolicy implements RejectedExecutionHandler { public AbortPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString()); } }//DiscardPolicy:不做任何處理直接拋棄任務 public static class DiscardPolicy implements RejectedExecutionHandler { public DiscardPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } }//DiscardOldestPolicy:先將阻塞隊列中的頭元素出隊拋棄,再嘗試提交任務 public static class DiscardOldestPolicy implements RejectedExecutionHandler { public DiscardOldestPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { e.getQueue().poll(); e.execute(r); } } }//CallerRunsPolicy:既不拋棄任務也不拋出異常,直接運行任務的run方法,換言之將任務回退給調用 者來直接運行 public static class CallerRunsPolicy implements RejectedExecutionHandler { public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { r.run(); } } } 5.執行線程 Executor //創建線程池 ExecutorService service = Executors.newFixedThreadPool(1); //執行 service.execute(new Runnable() { @Override public void run() { System.out.println("執行"); } })
|