天天看點

java開發中幾種常見的線程池

<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&lt;?&gt; submit(runnable task)</code>

<code>&lt;t&gt; future&lt;t&gt; submit(callable&lt;t&gt; 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>

線程間資料交換,都到達則自然交換