疑惑:不知道如何解决的技术难题...

javaxboy 2008-07-10 03:16:18

池化线程的任务管理模式:
每种线程都用自己的一个任务队列、用以保存任务,同时还拥有任务的添加和获取方法。线程实例通过这些任务的获取方法获取任务并执行。
例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用回调模式控制线程的工作状态?嘎嘎、太麻烦了点吧。
嘎嘎、愁~怎么搞? 谁有招来简单的解决这个问题呢?
...全文
59 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
javaxboy 2008-07-11
  • 打赏
  • 举报
回复
嗯、我打算作一个轻量级的线程池。学习了一下其他的线程池实现、他们都是基于runnable接口实现的。在接收到服务请求后、构建一个runnable对象,将这个runnable对象加入任务队列,等候线程池执行。我觉得他们这样作其实违背了设置线程池的最根本原因。构建和销毁runnable对象依然要消耗大量的系统资源.在实际的工作中、其实我们只需要将请求的参数传递到请求的线程即可。我们需要构建的不是线程、也不应该是runnable对象,而只是一个一个简单的参数对象。这样才能真正的做到缩短构建和销毁的时间、让系统资源更多的集中于业务逻辑的处理。
哎~ 看样子只能用麻烦的方式实现了~
gonxi 2008-07-11
  • 打赏
  • 举报
回复
不是太明白,你要做线程池?
  • 打赏
  • 举报
回复
study

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧