2012-08-02 91 views
0

我不是一个Java专家,我的问题是有些抽象,我需要怎么是一个最好地执行我的建议的架构和需求的建议。Java中,系统架构,正确实施

我将介绍我的要求:

我有接收任务处理(持有一个任务队列)经理对象,管理者应分配专用线程之间的任务。每个线程知道只执行特定类型的任务。

我创建了一个具有类型特定线程集合的主管理器类 当主管理器接收到一个新任务时,它会将任务推送到知道如何处理此任务的线程类对象的队列中(每个线程有它自己的任务队列)。

一个线程需要从他的队列池中的任务,当他完成处理先前的任务,但如果队列是空的,他不应该使用的资源和需要时,新任务到达被唤醒。

我虽然(可能不太好)是使用线程来扩展计时器对象和检查其队列的定时任务,但这不符合我的要求,直到新任务到达时释放资源。

来处理这些系统的要求可以理解的最佳方式有任何建议(我的问题不是一门功课,而是我的开发任务的一部分)。

编辑

我使用目前一种阻塞队列的任务队列(安以@Alexander Torstling答案),我的问题是不是并发的问题,而是一个建筑,我想免费的资源时,队列是空的,如果新任务到达,我想要被事件唤醒,如果我完成了任务处理,并且我有更多的任务,我将继续处理下一个任务;

+1

什么'爪哇。 util.concurrent'包吗?它包含很多有用的类,可以解决大量的时间。 – gkuzmin 2012-08-02 13:21:06

+1

@迈克尔:我一定误解了你。你说“如果队列是空的,他不应该使用资源”。如果你使用阻塞队列,这正是发生的情况。线程睡觉并且不使用任何资源。当新任务到达时,它立即醒来。这不是你所看到的行为吗? – 2012-08-02 13:49:02

+0

@Alexander Torstling:+1,我很抱歉,我没有”了解阻塞队列的所有功能,并使用它错,你是正确的,这是我需要的东西(正如我说我不是一个Java专家) 。只是为了澄清,如果我有更多的东西要做,但队列是空的,我会睡在queue.take()并不会继续更多的处理语句? – Michael 2012-08-02 13:55:22

回答

2

看一看BlockingQueue。为了避免创建太多的线程,您可能需要考虑使用Executor,它可以为您管理线程池。

1

我会用一个ExecutorService。这包队列和线程(或多个)的池

ExecutorService service = Executors.newXxxx(); // new thread pool. 


service.submit(new Runnable() { 
    public void run() { 
     process(task); 
    } 
}); 

这样(如果你喜欢或只是一个)单个线程池可以处理任何数量的不同类型的任务

+0

好吧,我明白你在暗示什么,你是否建议我每个任务类型都有执行者,那么主要经理将负责将任务提交给执行者?如果执行者完成了一个任务的处理,并且我在执行过程中再提交一个任务,他会打开另一个线程来执行它,还是在他将结束前一个任务的执行之后执行它? – Michael 2012-08-02 13:39:16

+1

我会使用您需要的最小数量的池。一个可能没问题,但在极端情况下,每个任务类型可以有一个池。如果您使用单个线程池或固定线程池,则它只会包含您告诉它具有的线程。如果您使用缓存线程池,它将根据需要创建线程。 – 2012-08-02 14:06:03

+0

谢谢,这很有帮助! – Michael 2012-08-02 16:20:21