importjava.util.LinkedList;importjava.util.List;public classMyThreadPool {//线程池中默认线程的个数为5个
private static int worker_num = 5;//工作的线程
privateWorkThread[] workThreads;//未处理的任务
private static volatile int finished_task = 0;//任务队列,作为一个缓冲,List线程不安全所以需要在使用的过程中对它进行同步。
private List taskQueue = new LinkedList();//单例模式
private staticMyThreadPool threadPool;//私有化构造方法
privateMyThreadPool(){this(5);
}//创建线程池,num为线程池工作线程的个数
private MyThreadPool(intnum) {
MyThreadPool.worker_num=num;
workThreads= newWorkThread[num];for (int i = 0; i < num; i++) {
workThreads[i]= newWorkThread();
workThreads[i].start();
}
}//获得一个线程池,默认线程数
public staticMyThreadPool getThreadPool(){returngetThreadPool(MyThreadPool.worker_num);
}//单例模式,获得一个线程池
public static MyThreadPool getThreadPool(intnum) {if(num <= 0){
num=MyThreadPool.worker_num;
}if(threadPool == null){synchronized(MyThreadPool.class){if(threadPool == null)
threadPool= newMyThreadPool(num);
}
}returnthreadPool;
}/*** 执行任务
* 将该任务加入到任务队列的末尾,等待工作线程的调度
*@paramtask*/
public voidexecute(Runnable task){synchronized(taskQueue){
taskQueue.add(task);
taskQueue.notify();
}
}/*** 批量执行任务
* 将任务放到任务队列的末尾,等待工作线程的调度
*@paramtask*/
public voidexecute(Runnable[] task){synchronized(taskQueue){for(Runnable runnable : task) {
taskQueue.add(runnable);
}
taskQueue.notify();
}
}/*** 批量执行任务
* 将任务放到任务队列的末尾,等待工作线程的调度
*@paramtask*/
public void execute(Listtask){synchronized(taskQueue){for(Runnable runnable : task) {
taskQueue.add(runnable);
}
taskQueue.notify();
}
}/*** 销毁线程池
* 在所有任务都完成的情况下才销毁所有线程,否则等待任务队列的任务全部完成才销毁*/
public voiddestroy(){while(!taskQueue.isEmpty()){//如果还有任务没执行完成,就等会再看看
try{
Thread.sleep(10);
}catch(InterruptedException e) {
e.printStackTrace();
}
}//工作线程停止工作,且置为null
for (int i = 0; i < MyThreadPool.worker_num; i++) {
workThreads[i].stopWorker();
workThreads[i]= null;
}
threadPool= null;
taskQueue.clear();
}//返回工作线程的个数
public intgetWorkThreadNumber() {returnworker_num;
}//返回已完成任务的个数
public intgetFinishedTaskNumber(){returnfinished_task;
}//返回任务队列的长度,即还没处理的任务个数
public intgetWaitTaskNumber(){returntaskQueue.size();
}//覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数
@OverridepublicString toString() {return "WorkThread number:" + worker_num + " finished task number:"
+ finished_task + " wait task number:" +getWaitTaskNumber();
}/*** 内部类,工作线程用来执行任务线程
*@authorliu
**/
private class WorkThread extendsThread{//该工作线程是否有效,用于自然结束该工作线程
private boolean isRunning = true;/** 工作线程的关键之处,如果任务队列不空,则取出任务执行,若任务队列空,则等待。直到任务队列有任务时才取出执行*/@Overridepublic voidrun() {
Runnable r= null;while( isRunning ){//队列为空
synchronized(taskQueue){while(isRunning &&taskQueue.isEmpty()){try{
taskQueue.wait(20);
}catch(InterruptedException e) {
e.printStackTrace();
}
}if(!taskQueue.isEmpty()){//取出任务
r = taskQueue.remove(0);
}
}if(r != null){
r.run();//完成的任务加一
finished_task += 1;
}
r= null;
}
}//停止工作,让该线程自然执行完run方法,自然结束
public voidstopWorker() {this.isRunning = false;
}
}
}