天天看點

線程池的簡單實作

<code>package</code> <code>com.mzsx.concurrent.threadpool;</code>

<code>import</code> <code>java.util.List;</code>

<code>import</code> <code>java.util.Vector;</code>

<code>public</code> <code>class</code> <code>ThreadPool {</code>

<code> </code><code>private</code> <code>static</code> <code>ThreadPool instance=</code><code>null</code><code>;</code>

<code> </code><code>//空閑的線程隊列</code>

<code> </code><code>private</code> <code>List&lt;PThread&gt; idleThreads;</code>

<code> </code><code>//已有的線程總數</code>

<code> </code><code>private</code> <code>int</code> <code>threadCounter;</code>

<code> </code><code>private</code> <code>boolean</code> <code>isShutdown;</code>

<code> </code> 

<code> </code><code>private</code> <code>ThreadPool(){</code>

<code>  </code><code>this</code><code>.idleThreads=</code><code>new</code> <code>Vector&lt;PThread&gt;(</code><code>5</code><code>);</code>

<code>  </code><code>threadCounter=</code><code>0</code><code>;</code>

<code> </code><code>}</code>

<code> </code><code>public</code> <code>int</code> <code>getCreatedThreadsCount(){</code>

<code>  </code><code>return</code> <code>threadCounter;</code>

<code> </code><code>//取得線程池的執行個體</code>

<code> </code><code>public</code> <code>synchronized</code> <code>static</code> <code>ThreadPool getInstance(){</code>

<code>  </code><code>if</code> <code>(instance==</code><code>null</code><code>) {</code>

<code>   </code><code>instance=</code><code>new</code> <code>ThreadPool();</code>

<code>  </code><code>}</code>

<code>  </code><code>return</code> <code>instance;</code>

<code> </code><code>//放入線程池</code>

<code> </code><code>protected</code> <code>synchronized</code> <code>void</code> <code>repool(PThread repoolingThread){</code>

<code>  </code><code>if</code> <code>(!isShutdown) {</code>

<code>   </code><code>idleThreads.add(repoolingThread);</code>

<code>  </code><code>}</code><code>else</code><code>{</code>

<code>   </code><code>repoolingThread.shutdown();</code>

<code>  </code> 

<code> </code><code>//停止線程池中所有的線程</code>

<code> </code><code>public</code> <code>synchronized</code> <code>void</code> <code>shutDown(){</code>

<code>  </code><code>isShutdown=</code><code>true</code><code>;</code>

<code>  </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; idleThreads.size(); i++) {</code>

<code>   </code><code>PThread idleThread=(PThread)idleThreads.get(i);</code>

<code>   </code><code>idleThread.shutdown();</code>

<code> </code><code>//執行任務</code>

<code> </code><code>public</code> <code>synchronized</code> <code>void</code> <code>start(Runnable target){</code>

<code>  </code><code>PThread thread=</code><code>null</code><code>;</code>

<code>  </code><code>//如果有空閑的線程,則直接使用</code>

<code>  </code><code>if</code> <code>(idleThreads.size()&gt;</code><code>0</code><code>) {</code>

<code>   </code><code>int</code> <code>lastIndex=idleThreads.size()-</code><code>1</code><code>;</code>

<code>   </code><code>thread=idleThreads.get(lastIndex);</code>

<code>   </code><code>//立即執行這個任務</code>

<code>   </code><code>thread.setTarget(target);</code>

<code>  </code><code>}</code><code>else</code> <code>{</code>

<code>   </code><code>threadCounter++;</code>

<code>   </code><code>//建立新線程</code>

<code>   </code><code>thread  =</code><code>new</code> <code>PThread(target, </code><code>"PThread#"</code><code>+threadCounter, </code><code>this</code><code>);</code>

<code>   </code><code>thread.start();</code>

<code>}</code>

<code>public</code> <code>class</code> <code>PThread </code><code>extends</code> <code>Thread {</code>

<code> </code><code>//線程池</code>

<code> </code><code>private</code> <code>ThreadPool pool;</code>

<code> </code><code>//任務</code>

<code> </code><code>private</code> <code>Runnable target;</code>

<code> </code><code>private</code> <code>boolean</code> <code>isSHutdown=</code><code>false</code><code>;</code>

<code> </code><code>private</code> <code>boolean</code> <code>isIdle=</code><code>false</code><code>;</code>

<code> </code><code>public</code> <code>PThread(Runnable target,String name,ThreadPool pool){</code>

<code>  </code><code>super</code><code>(name);</code>

<code>  </code><code>this</code><code>.pool=pool;</code>

<code>  </code><code>this</code><code>.target=target;</code>

<code> </code><code>public</code> <code>ThreadPool getPool() {</code>

<code>  </code><code>return</code> <code>pool;</code>

<code> </code><code>public</code> <code>void</code> <code>setPool(ThreadPool pool) {</code>

<code>  </code><code>this</code><code>.pool = pool;</code>

<code> </code><code>public</code> <code>Runnable getTarget() {</code>

<code>  </code><code>return</code> <code>target;</code>

<code> </code><code>public</code> <code>synchronized</code> <code>void</code> <code>setTarget(Runnable newTarget) {</code>

<code>  </code><code>target = newTarget;</code>

<code>  </code><code>notifyAll();</code>

<code> </code><code>public</code> <code>boolean</code> <code>isSHutdown() {</code>

<code>  </code><code>return</code> <code>isSHutdown;</code>

<code> </code><code>public</code> <code>void</code> <code>setSHutdown(</code><code>boolean</code> <code>isSHutdown) {</code>

<code>  </code><code>this</code><code>.isSHutdown = isSHutdown;</code>

<code> </code><code>public</code> <code>boolean</code> <code>isIdle() {</code>

<code>  </code><code>return</code> <code>isIdle;</code>

<code> </code><code>public</code> <code>void</code> <code>setIdle(</code><code>boolean</code> <code>isIdle) {</code>

<code>  </code><code>this</code><code>.isIdle = isIdle;</code>

<code> </code><code>} </code>

<code> </code><code>@Override</code>

<code> </code><code>public</code> <code>void</code> <code>run() {</code>

<code>  </code><code>//隻要沒有關閉,則一直不結束該線程</code>

<code>  </code><code>while</code><code>(!isSHutdown){</code>

<code>   </code><code>isIdle=</code><code>false</code><code>;</code>

<code>   </code><code>if</code> <code>(target!=</code><code>null</code><code>) {</code>

<code>    </code><code>//運作任務</code>

<code>    </code><code>target.run();</code>

<code>   </code><code>}</code>

<code>   </code><code>//任務結束,到閑置狀态</code>

<code>   </code><code>isIdle=</code><code>true</code><code>;</code>

<code>   </code><code>try</code> <code>{</code>

<code>    </code><code>//該線程任務結束後,不關閉線程,而是放入線程池空閑對了</code>

<code>    </code><code>pool.repool(</code><code>this</code><code>);</code>

<code>    </code><code>synchronized</code> <code>(</code><code>this</code><code>) {</code>

<code>     </code><code>wait();</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>   </code><code>} </code><code>catch</code> <code>(Exception e) {</code>

<code>    </code><code>// TODO: handle exception</code>

<code> </code><code>//關閉線程</code>

<code> </code><code>public</code>  <code>synchronized</code> <code>void</code> <code>shutdown(){</code>

<code>  </code><code>isSHutdown=</code><code>true</code><code>;</code>

<code>public</code> <code>class</code> <code>MyThread </code><code>implements</code> <code>Runnable {</code>

<code> </code><code>protected</code> <code>String name;</code>

<code> </code><code>public</code> <code>MyThread() {</code>

<code> </code><code>public</code> <code>MyThread(String name) {</code>

<code>  </code><code>super</code><code>();</code>

<code>  </code><code>this</code><code>.name = name;</code>

<code>  </code><code>try</code> <code>{</code>

<code>   </code><code>System.out.println(</code><code>this</code><code>.name);</code>

<code>   </code><code>Thread.sleep(</code><code>1</code><code>);</code>

<code>  </code><code>} </code><code>catch</code> <code>(Exception e) {</code>

<code>   </code><code>// TODO: handle exception</code>

<code>   </code><code>e.printStackTrace();</code>

<code>import</code> <code>java.util.concurrent.ExecutorService;</code>

<code>import</code> <code>java.util.concurrent.Executors;</code>

<code>public</code> <code>class</code> <code>Main {</code>

<code> </code><code>/**</code>

<code>  </code><code>* @param args</code>

<code>  </code><code>*/</code>

<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>  </code><code>// TODO Auto-generated method stub</code>

<code>  </code><code>//不使用線程池</code>

<code>  </code><code>/*for (int i = 0; i &lt; 1000; i++) {</code>

<code>   </code><code>new Thread(new MyThread("MyThread-"+i)).start();</code>

<code>  </code><code>}*/</code>

<code>  </code><code>//使用線程池</code>

<code>   </code><code>ThreadPool.getInstance().start(new MyThread("MyThread-"+i));</code>

<code>  </code><code>//JDK自帶的線程池</code>

<code>  </code><code>ExecutorService executorService=Executors.newCachedThreadPool();</code>

<code>  </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; </code><code>1000</code><code>; i++) {</code>

<code>   </code><code>executorService.execute(</code><code>new</code> <code>MyThread(</code><code>"MyThread-"</code><code>+i));</code>

 本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1420962