1 简单线程池
package com.jtzen9;
import java.util.LinkedList;
public class ThreadPool extends ThreadGroup {
private boolean isClosed = false;
private LinkedList<Runnable> workQueue;
private static int threadPoolID;
private int threadID;
public ThreadPool(int poolSize) {
super("ThreadPool-" + (threadPoolID++));
setDaemon(true);
workQueue = new LinkedList<Runnable>();
for (int i=0; i<poolSize; i++)
new WorkThread().start();
}
/**
* 向工作队列中加入一个新任务,由工作线程去执行该任务
* @param task 加入的任务
*/
public synchronized void execute(Runnable task) {
if (isClosed) {
throw new IllegalStateException();
}
if (task != null) {
workQueue.add(task);
notify();
}
}
/**
* 从工作队列中取出一个任务,工作线程会调用此方法
* @return
* @throws InterruptedException
*/
protected synchronized Runnable getTask()throws InterruptedException{
while (workQueue.size() == 0) {
if (isClosed) return null;
wait();
}
return workQueue.removeFirst();
}
/**
* 关闭线程池
*/
public synchronized void close() {
if (!isClosed) {
isClosed = true;
workQueue.clear();
interrupt();
}
}
/**
* 等待工作线程把所有任务执行完
*/
public void join() {
synchronized (this) {
isClosed = true;
notifyAll();
}
Thread[] threads = new Thread[activeCount()];
int count = enumerate(threads);
for (int i=0; i < count; i++) {
try {
threads[i].join();
}catch(InterruptedException ex) { }
}
}
/**
* 内部类:工作线程
*/
private class WorkThread extends Thread {
public WorkThread() {
super(ThreadPool.this,"WorkThread-" + (threadID++));
}
public void run() {
while (!isInterrupted()) {
Runnable task = null;
try {
task = getTask();
}catch (InterruptedException ex){}
if (task == null)
return;
try {
task.run();
} catch (Throwable t) {
t.printStackTrace();
}
}
}
}
}
2 测试
package com.jtzen9;
public class Main {
public static void main(String[] args){
ThreadPool threadPool = new ThreadPool(3);
for (int i = 0; i < 5; i++) {
threadPool.execute(createTask(i));
}
threadPool.join();
threadPool.close();
}
/** 定义了一个简单的任务(打印ID) */
private static Runnable createTask(final int taskID) {
return new Runnable() {
public void run() {
System.out.println("Task " + taskID + ": start");
try {
Thread.sleep(500);
} catch (InterruptedException ex) { }
System.out.println("Task " + taskID + ": end");
}
};
}
}
3 输出
Task 0: start
Task 1: start
Task 2: start
Task 1: end
Task 0: end
Task 3: start
Task 4: start
Task 2: end
Task 3: end
Task 4: end