1. 程式人生 > >java建立執行緒池

java建立執行緒池

1. PoolTest(測試類)實現了Runnable介面,在建構函式中建立ThreadPool(執行緒池類)物件;
   執行任務runTask,將執行緒從Vector freeThreads轉移到Vector inUseThreads,並呼叫PoolableThread的setTask。
2. ThreadPool在建構函式中,建立了10個PoolableThread(控制執行緒類),start執行緒,並把執行緒加入Vector freeThreads裡。
3. PoolableThread在開始建立的時候什麼也不是做,進入阻塞狀態;直到runTask裡呼叫了setTask,notify自己讓PoolTest執行緒 run;
   PoolTest run後即刻置null,將執行緒從Vector inUseThreads轉移到Vector freeThreads。
4. PoolTest run的時候列印“執行緒名開始”,相隔2秒,列印“執行緒名結束”。

//ThreadPool

package com.wrox.threadpool;
import java.util.*;

public class ThreadPool extends Thread
{
 private Vector freeThreads = new Vector();
 private Vector inUseThreads = new Vector();
 private static int INITIAL_SIZE = 10;

 public ThreadPool()
 {
  fillPool(INITIAL_SIZE);
 }

 private void fillPool(int poolsize)
 {
  for(int i=0; i<poolsize; i++)
  {
   PoolableThread pt = new PoolableThread(this);
   pt.start();
   freeThreads.add(pt);
  }
  try
  {
   Thread.sleep(2000);
  }
  catch(InterruptedException ie)
  {
  }
 }

 public synchronized void runTask(Runnable task)
 {
  if(freeThreads.isEmpty())
  {
   throw new RuntimeException("ALL threads are in use");
  }
  PoolableThread t = (PoolableThread)freeThreads.remove(0);
  t.setTask(task);
 }

 synchronized void free(PoolableThread t)
 {
  inUseThreads.remove(t);
  freeThreads.add(t);
 }
}

//PoolableThread

package com.wrox.threadpool;

class PoolableThread extends Thread
{
 Runnable task = null;
 ThreadPool pool;

 PoolableThread(ThreadPool pool)
 {
  this.pool = pool;
 }

 synchronized void setTask(Runnable task)
 {
  this.task = task;
  notify();
 }

 synchronized void executeTasks()
 {
  for(;;)
  {
   try
   {
    if(task == null)
    {
     wait();
    }
   }
   catch(InterruptedException ex)
   {
   }
   task.run();
   task = null;
   pool.free(this);
  }
 }

 public void run()
 {
  executeTasks();
 }
}

//PoolTest

package com.wrox.threadpool;

public class PoolTest implements Runnable
{
 public PoolTest()
 {
  ThreadPool tp = new ThreadPool();
  for(int i=0; i<10; i++)
  {
   tp.runTask(this);
  }
  try
  {
   Thread.sleep(400000);
  }
  catch(Exception ex)
  {
  }
 }

 public static void main(String[] args)
 {
  PoolTest poolTest1 = new PoolTest();
 }

 public void run()
 {
  System.out.println("Start on " + Thread.currentThread().getName());
  try
  {
   Thread.sleep(2000);
  }
  catch(InterruptedException ex)
  {
  }
  System.out.println("Done on " + Thread.currentThread().getName());
 }
}