<a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/executors.html">java.util.concurrent:class executors</a>
幾種常用的的生成線程池的方法:
<code>newcachedthreadpool</code>
<code>newfixedthreadpool</code>
<code>newscheduledthreadpool</code>
<code>newsinglethreadexecutor</code>
<code>newsinglethreadscheduledexecutor</code>
例子:<code>newfixedthreadpool</code>
單線程<code>newsinglethreadexecutor</code>可用于重新開機
用線程池啟動定時器
例子:類似timer的定時執行
<code>executorservice</code>在<code>executor</code>的基礎上增加了一些方法,其中有兩個核心的方法:
<code>future<?> submit(runnable task)</code>
<code><t> future<t> submit(callable<t> task)</code>
這兩個方法都是向線程池中送出任務,它們的差別在于<code>runnable</code>在執行完畢後沒有結果,<code>callable</code>執行完畢後有一個結果。這在多個線程中傳遞狀态和結果是非常有用的。另外他們的相同點在于都傳回一個future對象。<code>future</code>對象可以阻塞線程直到運作完畢(擷取結果,如果有的話),也可以取消任務執行,當然也能夠檢測任務是否被取消或者是否執行完畢。
lock功能類似傳統多線程技術裡的<code>synchronized</code>,實作線程互斥,但更加面向對象。将需要互斥的代碼片段放到<code>lock.lock();</code>和<code>lock.unlock();</code>之間。
例子
讀寫鎖
<a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/reentrantreadwritelock.html">java.util.concurrent.locks:class reentrantreadwritelock</a>
javadoc文檔讀寫鎖例子,緩存:
重點注意在釋放寫鎖前加讀鎖那部分代碼,注釋為<code>// downgrade by acquiring read lock before releasing write lock</code>。自己挂了寫鎖,再挂讀鎖是可以的,這面涉及的技巧以後再研究。
condition類似于傳統多線程技術中的<code>object.wait</code>和<code>object.notify</code>,實作線程間同步。
javadoc文檔例子,可阻塞隊列
<a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/locks/condition.html">class boundedbuffer例子</a>
使用了兩個<code>condition</code>
<code>semaphore</code>
類似占坑
<code>cyclicbarrier</code>
階段性使進度一緻
<code>countdownlatch</code>
一人通知多人/多人通知一人
<code>exchanger</code>
線程間資料交換,都到達則自然交換