如果您需要每个线程都有自己的 RNG,使用 ThreadLocal 可能是最简单的方法。
然而,在我看来,这不是一个非常干净的解决方案,因为它将属于执行程序的线程与特定任务耦合在一起。我认为总的来说,将 RNG 分配给任务对象会更有意义。
有了给出的附加信息,我认为最好的办法是创建一个类,即 MyTask,实现 Runnable,它表示从列表中读取图像区域、处理它们,然后继续下一个的任务。当没有更多区域要处理或遇到错误时,任务将完成。MyTask 将有自己的私有 RNG 用于图像生成。
MyTask implements Runnable {
private final Random random;
// Queue is shared
private final Queue<ImageArea> areasToProcess;
public MyTaks(Random random, Queue<ImageArea areasToProcess) {
this.random = random;
this.areasToProcess = areasToProcess;
}
public void run() {
ImageArea areaToProcess;
while((areaToProcess = areasToProcess.poll()) != null) {
process(areaToProcess);
}
}
}
使用这样的可运行类,您可以轻松地直接使用线程或 ExecutorService。请注意,该类假定包含要处理的图像区域的队列在处理开始之前已填满。