线程池有以下几个部分:
1.完成主要任务的一个或多个线程.
2.用于调度管理的管理线程.
3.要求执行的任务队列.
一个线程池至少应该具有以下几个方面的功能:
1.提供一个任务接口以便用户加入任务
这里需要有两个组件,一是规定操作的任务接口:
interface ITask{ public void task(); }
一是存放操作的容器.容器可以根据调度策略来选择或自己实现,比如一个最简单的FIFO策略的容器
可以用LinkedList来实现.需要注意的是对这个容器的存取需要同步:
class TaskList{ private LinkedList<ITask> tl = new LinkedList(); public synchronized void addTask(ITask task){ this.tl.add(task); //notifyAll(); } //加上addFistTask和addLastTask public synchronized ITask getTask(){ if(this.size() <= 0) wait(); return this.tl.poll(); } //加上getFistTask和getLastTask public synchronized int getCount(){ return this.tl.size(); } public synchronized void removeAll(){ this.tl.clear(); } }
加上addFistTask和addLastTask, getFistTask和getLastTask实现就可以实现简单的优先级调度.
2.工作线程
我们把用来执行用户任务的线程称为工作线程,工作线程就是不断从队列中获取任务对象并执行对象
上的业务方法:
class WorkThread extends Thread{ private TaskList list; //多个工作线程共同从一个任务队列中获取任务,所以要从外面传入一个任务队列. public WorkThread(String name,TaskList list){ super(name); this.list = list; } public void run(){ while(true){ ITask task = null; task = list.getTask(); if(task != null) task.task(); } } }
这里还需要加入对线线程状态的判断.
然后需要有一个对工作线程的调度线程.完成以下几个功能:
1.生成需要的工作线程.由于创建线程需要一定的开销,一定要注意所创建的所有线程不能超一个设定
的最大值.建议最大值不要超25.
2.动态自适应调整集合中线程数.当有太多的线程处于闲置状态时(队列中没有任务),应该按一定比例
销毁闲置了一定时的线程.如果队列中任务队列积压太多而工作线程总数没有超最大线程数时应该及时
创建工作线程直至达到是大值.
3.需要一个专门的后台线程定时扫描队列中任务与正在工作的线程总数,闲置的线程总数.
以上功能有不同优化方法实现,可以参考JDK的线程池实现.