疑惑:不知道如何解决的技术难题...
池化线程的任务管理模式:
每种线程都用自己的一个任务队列、用以保存任务,同时还拥有任务的添加和获取方法。线程实例通过这些任务的获取方法获取任务并执行。
例1、
public class a extends Thread{
static Queue taskQueue = new Queue();//我自己用多维数组实现的队列:用add和get操作
public static void addTask(Object task){
taskQueue.add(task);
//...检查队列的头部任务等候时间、如果超出MaxWaitTime则唤醒一定数量的线程进入工作状态。
}
public static Object getTask(){
//实际情况:如果在MaxWaitTime时间内多次获取的任务为空、则本线程进入睡眠状态。
return taskQueue.get();
}
}
线程A的任务操作方法是如此、线程b的任务操作模式也是如此。但是却没有一个办法让a\b自动拥有这些操作方法而不需要每个线程重复加入以上代码。
设想解决方案一:继承:继承不能解决这个问题。所有的线程到都可以操作任务的添加和获取方法,但是他们的所有任务都加在了同一个任务队列中。子线程根本没有办法区分到底谁是谁的任务。当然这个也可以用Map的方式加以区分而解决。不过操作方法就只能在子类中单独实现。这个方案不能解决问题。
设想解决方案二:接口:但是Java中的接口只能规定子类拥有相同特征的方法、却不能申明子类拥有相同特征的变量。在接口中声明的变量是常量。该设想不能解决问题。
设想解决方案三:任务管理功能单独成为设计成一个类(TaskManager)。在所有的线程中均使用这个类来管理任务,这样可以最大的解决重复问题。但是依然需要在每个线程的头部声明一个TaskManager.
但是如果用这个方式来解决任务调度模式的话、如何在添加任务的时候唤醒线程?又如何在获取任务为空的时候睡眠线程呢?如果用内类的话,那就需要在每个线程中再次实现TaskManager这个和在每个线程中实现这些方法没有多大的区别。难道在构建TaskManager的时候注入本线程的引用,然后TaskManager用回调模式控制线程的工作状态?嘎嘎、太麻烦了点吧。
嘎嘎、愁~怎么搞? 谁有招来简单的解决这个问题呢?