1

我正在制作一个分发任务的程序。我有这样的通信器对象的arraylist:

ArrayList<Workers>

我正在处理一个文件,将它分成固定大小的块并分派给各个工人。我正在使用迭代器将块均匀地传递给工人。通常有比工人更多的块,所以我需要在我的工人周围循环。我该怎么做,我当前的解决方案使用这样的迭代器。

    private Worker getNextWorker() {
    if (workerIterator == null)
        workerIterator = workers.iterator();

    if (!workerIterator.hasNext())
        workerIterator = workers.iterator();

    return workerIterator.next();
}

我同步了方法以及方法修改了arraylist,但这并不安全,因为另一个线程可以进入并修改迭代器调用之间的集合。因此,我同步了整个文件拆分过程,使其成为一个大的原子语句。

1)我错过了什么吗?

2)是否有另一种,也许更好的方法可以围绕功能进行循环。

4

2 回答 2

2

我建议您不要重新发明轮子并为此目的BlockingQueue结合使用。ThreadPoolExecutor

于 2013-03-18T22:46:52.673 回答
1

您可以启动工作线程(没有执行程序),并让它们take从有界阻塞队列中获取元素。当您读取文件时,您会put在队列中分块。当队列已满时,调用put将阻塞,直到工作人员从队列中取出一项任务。如果队列为空,则工作人员将等待,直到将任务放入队列。完成处理后,您可以interrupt使用工作线程。

或者,您可以使用ThreadPoolExecutor带有有界阻塞队列的 a和CallerRunsPolicy. 这样,如果队列未满,任务将被提交执行。如果队列已满,调用者线程将执行任务(这为工作人员提供了处理时间)。使用这种方法,您最多将拥有number_of_threads+queue_capacity块,但在主线程正在处理时,一些工作线程可能处于空闲状态。

于 2013-03-18T23:30:40.273 回答