import java.util.LinkedList;
/**
功能:一个线程池是一组有限数量的线程,它们被用来完成执行任务
翻写作者:Arkliszeng
时间:2010-02-21
地点:北大青鸟锦江中心学术部
版本:ver 1.0.0
备注:
线程池使用ThreadGroup API来实现.线程组表示一个线程的集合。
此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,
除了初始线程组外,每个线程组都有一个父线程组。允许线程访问
有关自己的线程组的信息,但是不允许它访问有关其线程组的父线
程组或其他任何线程组的信息。
*/
public class ThreadPool extends ThreadGroup {
private boolean isAlive; //表示线程是否活首
private LinkedList taskQueue; //定义一个双向队列
private int threadID; //保存线程的ID
private static int threadPoolID; //表示线程池的ID
/**
在构造方法创建线程池
@参数numThreads用来指定池中的线程个数
*/
public ThreadPool(int numThreads) {
super("线程池-" + (threadPoolID++));
setDaemon(true);//让该线程组为精灵线程组
isAlive = true;//设置初始值为true
taskQueue = new LinkedList();//初始化任务队列
for (int i=0; i<numThreads; i++) {
new PooledThread().start();//启动池中的线程
}
}
/**
功能:请求一个新的任务来运行,该方法立即返回。然后任务在下一下空闲
的线程中执行。该方法是线程安全的。
<p>任务开始执行时有序的到达时开始。
@参数task表示运行的任务。如果不null,那么没有任务执行。
@如果本ThreadPool关闭了,那么抛出IllegalStateException。
*/
public synchronized void runTask(Runnable task) {
//如果线程池的状态isAlive==false值
if (!isAlive) {
throw new IllegalStateException();//那么抛出异常
}
//如果任务不为null
if (task != null) {
//那么在任务把该任务加入任务阶段
taskQueue.add(task);
//然后唤醒空闲的线程执行该任务
notify();
}
}
/**
功能:获取任务对象
*/
protected synchronized Runnable getTask() throws InterruptedException{
//如果任务队列不是空的
while (taskQueue.size() == 0) {
//如果线程池的状态isAlive==false值
if (!isAlive) {
return null; //那么返回null值
}
wait();//否则等待任务出现(添加任务)
}
//否则任务队列中的一个任务对象
return (Runnable)taskQueue.removeFirst();
}
/**
功能:关闭该线程池并且立即返回。让所有线程停止执行,并且所有等待任务停止执行。
一旦一个ThreadPool被关闭了,那么该线程池中的所有的线程不再运行。
*/
public synchronized void close() {
//如果线程池是活的
if (isAlive) {
//那么置为false
isAlive = false;
//然后把任务队列清空
taskQueue.clear();
//最后终止线程池中所有线程的运行
interrupt();
}
}
/**
功能:关闭该ThreadPool活动,然后等待所有的线程运行完成。这样所有等待的任务会被执行。
*/
public void join() {
// 当ThreadPool不再活动时唤醒所有等待的线程
synchronized (this) {
isAlive = false;
notifyAll();
}
// 然后等待所有池中的线程对象执行完毕
Thread[] threads = new Thread[activeCount()]; //创建所有池中的活动线程
//把此线程组及其子组中的所有活动线程复制到指定数组中
int count = enumerate(threads);
//然后按序让每个线程执行完毕
for (int i=0; i<count; i++) {
try {
threads[i].join();
}
catch (InterruptedException ex) { }
}
}
/**
功能:定义线程池中的线程,这些线程对象用来运行任务对象(Runnables)
翻写作者:Arkliszeng
时间:2010-02-21
地点:北大青鸟锦江中心学术部
版本:ver 1.0.0
备注:
PooledThread类是Thread类对象,它是一个内部类
*/
private class PooledThread extends Thread {
public PooledThread() {
//呼叫父类的构造方法Thread(ThreadGroup group, String name),
//把该线程分配指定的线程组对象中去
super(ThreadPool.this,"池中线程-" + (threadID++));
}
//重写run方法,执行任务对象
public void run() {
//如果本线程是没有断的--isInterrupted方法测试线程是否已经中断。线程的中断状态不受该方法的影响。
//对于isInterrupted方法,如果该线程已经中断,则返回 true;否则返回 false
while (!isInterrupted()) {
//那么从线程池中获取一个任务对象来执行
Runnable task = null;
try {
task = getTask();
}catch (InterruptedException ex){
ex.printStackTrace();
}
//如果getTask()返回null或者被中断了,那么使用return语句来关闭该线程
// close this thread by returning.
if (task == null) {
return;
}
//否则执行任务对象,并且消除所有异常信息
try {
task.run();
}catch (Throwable t) {
//呼叫ThreadGroup类的静态方法处理异常
uncaughtException(this, t);
}
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页