Java知識分享網 - 輕松學習從此開始!????

Java知識分享網

Java1234官方群25:java1234官方群25
Java1234官方群25:838462530
        

實戰springboot+CAS單點登錄課程(免費領取)

SpringBoot打造全棧在線教育平臺實戰課程

畢設代做論文包查重聯系人QQ:1982956321畢設大神 畢設代做論文包查重

66套java實戰課程無套路領取

Java1234 VIP課程

領取微信掃碼登錄Java實現視頻教程

Java1234至尊VIP(特價活動)
當前位置: 主頁 > Java文檔 > Java基礎相關 >

線程池原理-ThreadPoolExecutor PDF 下載


分享到:
時間:2020-11-20 10:09來源:http://www.nukdnfhq.buzz 作者:小鋒  侵權舉報
線程池原理-ThreadPoolExecutor PDF 下載
失效鏈接處理
線程池原理-ThreadPoolExecutor PDF 下載

本站整理下載:
 
相關截圖:


主要內容:

創建線程池 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("執行"); } })
 
------分隔線----------------------------
鋒哥公眾號


鋒哥微信


關注公眾號
【Java資料站】
回復 666
獲取 
66套java
從菜雞到大神
項目實戰課程
山东麻将怎么开牌 7262832491997914929546446964187948315329670297076557389422816739728635237322426924536933270658100 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();