【发布时间】:2014-04-14 21:44:10
【问题描述】:
我的问题是:我最多可以运行三个并发任务。这些任务可以同时处理 1 到 100 个作业。我有很多线程不断提交单个作业,我想尽快回复它们。在一项任务中处理 100 个作业所需的时间与在一项任务中处理 1 个作业所需的时间相同。作业以随机间隔出现。提交作业的线程需要阻塞,直到作业完成或超时。快速响应提交作业的线程是这里的驱动程序。
所以我目前的逻辑是这样的:如果有
我只是不太确定在 Java 中设置它的最佳方法。我创建了一个简单的信号量版本,它工作正常,但没有利用同时提交作业的能力。我应该如何最好地扩展它以完全满足我的要求? (不需要使用信号量,这正是我目前所拥有的)。
private static final Semaphore semaphore = new Semaphore(3);
public static Response doJob(Job job) throws Exception
{
final boolean tryAcquire = this.semaphore.tryAcquire(this.maxWaitTime, TimeUnit.MILLISECONDS);
if (tryAcquire)
{
try
{
return doJobInNewTask(job); // we'd actually like to do all the jobs which are queued up waiting for the semaphore (if there are any)
}
finally
{
this.semaphore.release()
}
}
}
【问题讨论】:
-
研究
java.util.concurrent中的类,尤其是执行器和线程池。您可能不必重新发明轮子。 -
@JimGarrison 谢谢,我会的,到目前为止,我在该领域的研究还没有提出任何明显的答案。你能指出我更具体的吗?棘手的部分是在某些情况下而不是在其他情况下一起处理排队的任务。默认情况下,线程池和执行程序似乎没有给我那种级别的控制,但我可能看不正确。
标签: java asynchronous concurrency java.util.concurrent