<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<PThread> 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<PThread>(</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 < 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()></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 < 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 < </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