/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.cachepool.threadpool.arrayThreadPool;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;
import com.jinhe.tss.core.cachepool.extend.assignment.IAssignment;
/**
* <p> ArrayThreadPool.java </p>
*
* 线程池(:池由一个数组简单实现)。</p><p>
* 对池中的所有线程来说,它们都共享池的工作队列。</p><p>
* 所以工作队列要求能实现同步,通过Collections.synchronizedList(new LinkedList())实现。</p><p>
* 如果队列不为空的话,那么线程将反复的执行,来完成工作队列中的每个工作,直到工作队列为空。</p><p>
*
* @author 金普俊 2007-1-9
*/
public class ArrayThreadPool {
protected Logger log = Logger.getLogger(this.getClass());
private final ThreadPoolWorker[] workers;
private final List<IAssignment> workQueue;
public ArrayThreadPool(int nThreads) {
workQueue = Collections.synchronizedList(new LinkedList<IAssignment>());
workers = new ThreadPoolWorker[nThreads];
for (int i = 0; i < nThreads; i++) {
workers[i] = new ThreadPoolWorker("Thread pool Worker " + i);
workers[i].start();
}
}
public void excute(IAssignment o) {
log.debug("$$$ ArrayThreadPool.excute: " + o + "$$$");
synchronized (workQueue) {
workQueue.add(o);
workQueue.notifyAll(); // workQueue在ThreadPoolWorker.run方法里wait()
}
}
public class ThreadPoolWorker extends Thread {
public ThreadPoolWorker(String name){
super(name);
}
public void run() {
IAssignment o;
while (true) {
synchronized (workQueue) {
while (workQueue.isEmpty()) {
try {
workQueue.wait();
} catch (InterruptedException ignored) {
}
}
o = (IAssignment) workQueue.remove(0); //将任务从队列中移除
}
// 执行任务队列中的任务,由ThreadPool中的一个Worker来执行
try {
if (o != null) {
log.info("---" + this + ".run : " + o + "---");
o.excute();
}
} catch (RuntimeException e) {
}
}
}
public String toString(){
return super.getName();
}
}
}