0

今まで、私は常に昔ながらの方法で独自のスレッドを作成していました (1.5 Java 同時実行より前)。しかし、エグゼキューターなどをチェックしたいと思います。私は基本的にそれらの使用方法を知っていますが、私の場合、各スレッドに独自の乱数ジェネレーターが必要です。Java 1.7 には ThreadLocalRandom があり、これはまさに私が達成したいことですが、独自の PRNG (QMC であろうと他のものであろうと) を使用します。

もう一度:

8 つのスレッドのプールであるエグゼキューターを作成し、スレッドごとにローカルな独自のランダム ジェネレーターを使用する一連のタスクを与えたいと考えています (各スレッドには、異なるシードで作成された独自のインスタンスがあります)。それを行う最良の方法は何ですか?できれば、最もクリーンで最高のパフォーマンスを発揮します。スレッドローカルかな?私はそれを使用する必要はありませんでしたが、誰が知っていますか...

ありがとう、ミハル。

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 に答える