0

在java中,以下问题的有效解决方案是什么:

我有多个线程(10-20 个左右)生成作业(“Job Creators”),以及一个能够执行它们的线程(“The worker”)。一旦工作创建者发布了工作,它应该等待工作完成,除了“它完成了”之外没有其他结果,然后再继续。

为了将作业发送到工作线程,我认为环形缓冲区或类似的标准扇入设置可能是一个好方法?但是对于一个 Job Creator 发现她的工作已经完成,我不太确定..

工作创建者可以睡觉,工作人员在完成后会打断他们。或者每个工作创建者可以有一个原子布尔值,它会检查并由工作人员设置。我不知道,这两个都不是很好。我想用尽可能少的(如果可能的话,没有)锁来做到这一点。所以要明确一点:我正在寻找的是速度,而不一定是简单性。

有没有人有什么建议?阅读有关并发策略的链接也非常受欢迎!

4

2 回答 2

1

我更喜欢单线程执行器服务,只需将工作实例提交给它(获得结果的未来)。然后,您可以 get() 未来都阻塞,直到结果可用并获得结果

public class TheWorker {
  private final ExecutorService service = Executors.newSingleThreadedExecutor();

  public Result work(Job job) {
    return service.submit(new Callable<Result>(){
      ...
    }).get()
  }

}
于 2012-09-11T21:14:29.593 回答
1

有几种方法可以做到这一点。最快的方法可能是只使用Semaphore一个单线程执行器。

private final Executor executor = Executors.newSingleThreadExecutor();

public void submitJob() {
    Semaphore semaphore = new Semaphore(0);
    executor.execute(new Job(semaphore));
    semaphore.acquire(); // Will block until semaphore.release() below
}

然后在 Job 类中:

public class Job implements Runnable {

    private final Semaphore semaphore;

    public Job(Semaphore semaphore) {
        this.semaphore = semaphore;
    }

    @Override
    public void run() {
        // Perform task and run the actual job
        semaphore.release(); // Cues the submitter to continue at semaphore.acquire()
    }
}

Semaphore速度相当快,比使用synchronized块快得多。

编辑:我还应该注意,这避免了很多开销Future,因此可能也比Future其他人建议的实现更快,但如果没有自己测试,我不能确定。

于 2012-09-11T21:30:08.900 回答