imp
public class ThreadPool
{
private static ThreadPool theInstance;
private final int nThreads;//线程池的大小
private final Workers[] threads;//用数组实现线程池
private final LinkedList queue;//任务队列
/**
* 单例构造方法
*
* @return
*/
public static ThreadPool getInstance() {
if (theInstance == null)
theInstance = new ThreadPool();
return theInstance;
}
/**
* 私有构造方法 默认1个线程在跑
*/
private ThreadPool() {
//默认1个线程在跑
this.nThreads = 1;
queue = new LinkedList();
threads = new Workers[nThreads];
for (int i=0; i<nThreads; i++) {
threads[i] = new Workers();
threads[i].start();//启动所有工作线程
}
}
/**
* 直接构造线程队列方法
*
* @deprecated
* @param nThreads
*/
public ThreadPool(int nThreads){
this.nThreads = nThreads;
queue = new LinkedList();
threads = new Workers[nThreads];
for (int i=0; i<nThreads; i++) {
threads[i] = new Workers();
threads[i].start();//启动所有工作线程
}
}
/*
*
*执行任务
*/
public void execute(Runnable r) {
synchronized(queue) {
queue.addLast(r);
queue.notify();
}
}
private class Workers extends Thread {//工作线程类
// logger logger
public void run() {
Runnable r;
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {//如果任务队列中没有任务,等待
try{
queue.wait();
}catch (InterruptedException ignored){}
}
r = (Runnable) queue.removeFirst();//有任务时,取出任务
}
try {
r.run();//执行任务
}catch (RuntimeException e) {
// You might want to log something here
}
}
}
}
public static void main(String args[]){
ThreadPool wq=new ThreadPool(1);//10个工作线程
Mytask task[]=new Mytask[20];//20个任务
for(int i=0;i<20;i++){
task[i]=new Mytask();
wq.execute(task[i]);
}
}
}
class Mytask implements Runnable{//任务接口
public void run(){
String name=Thread.currentThread().getName();
try{
//System.out.println(System.currentTimeMillis());
Thread.sleep(100);//模拟任务执行的时间
}catch(InterruptedException e){}
System.out.println(name+" executed OK");
}
}