目次 | 前項目 | 次項目 内部クラス仕様


補足例: マルチスレッドタスクのパーティション

各サブタスクをスレッドに割り当てることによって、1 つのタスクを独立した複数のサブタスクに併行化することは、時々有用です。これによって、複数のプロセッサが関わる場合は、タスク全体が速く終了します。(複数のサブタスクがネットワークトラフィックを実行する場合が、このケースに該当します。) 対話型の Java プログラムでは、マルチスレッドが使用され、サブタスクからの部分的な結果をエンドユーザにプッシュできるようにしています。一方では遅いサブタスクが少しずつ処理を行います。

次のコード(Doug Lea の例に基づく)は、いくつかのピクチャのレンダリングを制御する非常に簡単な方法を示します。その方法は、各ピクチャは用意でき次第ディスプレーヤに送られますが、元の要求側はすべてのレンダリングが完了するまでブロックします。各サブタスクは各スレッドの心臓部である Runnable の匿名実装によってコード化されます。

    public class GroupPictureRenderer {
      private PictureRenderer renderer;
      private PictureDisplayer displayer;
      ...
    
      public Picture[] render(final byte[][] rawPictures)
                        throws InterruptedException {
        Thread workers[] = new Thread[rawPictures.length];
        final Picture results[] = new Picture[rawPictures.length];
        // start one thread per rendering sub-task
        for (int ii = 0; ii < rawPictures.length; ii++) {          final int i = ii;   // capture ii for each new thread
          Runnable work = new Runnable() {
                public void run() {
                  results[i] = renderer.render(rawPictures[i]);
                  displayer.display(results[i]);
                }
          };
          workers[i] = new Thread(work, "Renderer");
          workers[i].start();
        }
        // all threads are running; now wait for them all to finish
        for (int i = 0; i < workers.length; i++)
          workers[i].join();
        // give all the finished pictures to the caller, too:
        return results;
      }
    }


目次 | 前項目 | 次項目

内部クラス仕様 (HTML generated by dkramer on March 15, 1997)
Copyright (c) 1996, 1997 Sun Microsystems, Inc. All rights reserved
コメントや訂正は john.rose@eng.sun.com 宛てに送ってください。