ジェネレータのストリームの作成

最初のジェネレータでインタフェースRandomGenerator.StreamableGeneratorが実装されている場合は、メソッドrngs()jumps() (ジャンプ可能なジェネレータの場合)、またはleaps() (リープ可能なジェネレータの場合)を呼び出して、ジェネレータのストリームを作成します。ストリームでmap()メソッドを呼び出して、各ジェネレータを独自のスレッドに割り当てます。

jumps()メソッドを呼び出すと、ジェネレータはその状態サイクル内で一定の大きな距離をジャンプして状態を変更し、ジェネレータの新しい状態に基づいて新しいジェネレータを作成します。ジェネレータは、ジャンプとジェネレータの作成を繰り返し、ジェネレータのストリームを作成します。leaps()メソッドは似ていますが、ジャンプのサイズは非常に大きくなります。

次の例では、ジャンプ可能なジェネレータを作成し、jumps()メソッドを呼び出して、この最初のジェネレータに基づいてジェネレータのストリームを作成します。ストリームの最初のいくつかのジェネレータ(NUM_TASKSで定義)がTaskインスタンスにラップされ、各Taskが独自のスレッドで実行されます。

       int NUM_TASKS = 10;
       
       RandomGeneratorFactory<JumpableGenerator> factory =
            RandomGeneratorFactory.of("Xoshiro256PlusPlus");
       JumpableGenerator random = factory.create();
       
       class Task implements Runnable {
            private int p;
            private RandomGenerator r;
            public Task(RandomGenerator prng) {
                r = prng;
            }
            public void run() {
                System.out.println(r.nextLong());
            }
        }
        
        List<Thread> taskList = random
            .jumps()
            .limit(NUM_TASKS)
            .map(prng -> new Thread(new Task(prng)))
            .collect(Collectors.toList());
        taskList.stream().forEach(t -> t.start());