java建立執行緒池
執行任務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());
}
}