0

到目前为止,我一直只是用老式的方式创建自己的线程(在 1.5 java 并发之前)。但我想看看 Executors 和其他东西。我基本上知道如何使用它们,但就我而言,我需要每个线程都有自己的随机数生成器。我知道 Java 1.7 具有 ThreadLocalRandom 这正是我想要实现的,但使用我自己的 PRNG(无论是 QMC 还是其他任何东西)。

再说一遍:

我想创建一个由 8 个线程组成的执行器池,并给它一堆任务,这些任务使用我自己的随机生成器,每个线程都是本地的(每个线程都有自己的实例,用不同的种子创建)。最好的方法是什么?最好是最干净、性能最好的。ThreadLocal 也许?我从来没有用过它,但谁知道......

谢谢,迈克尔。

4

1 回答 1

2

如果您需要每个线程都有自己的 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。请注意,该类假定包含要处理的图像区域的队列在处理开始之前已填满。

于 2012-12-22T19:42:39.910 回答