站内搜索: 请输入搜索关键词
当前页面: 在线文档首页 > JDK 5 Documentation v1.1.8, Java 2 SDK 英文文档

JDK 5 Documentation v1.1.8, Java 2 SDK 英文文档

Contents | Prev | Next Inner Classes Specification


Further Example: Multi-threaded task partitioning.

It is sometimes useful to parallelize a task with independent sub-tasks, by assigning each sub-task to a thread. This can make the whole task finish sooner, if multiple processors are involved. (This will be the case, if the sub- tasks perform network traffic.) In interactive Java programs, multithreading is also used to enable partial results from sub-tasks to be pushed through to the end user, while slower sub-tasks continue to grind away.

The code below (based on an example from Doug Lea) shows a very simple way to control the rendering of several pictures in such a way that each picture is delivered to a displayer as soon as it's ready, but the original requester blocks until all rendering is finished. Each sub-task is coded by an anonymous implementation of Runnable which is at the heart of each thread.

    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;
      }
    }


Contents | Prev | Next

Inner Classes Specification (HTML generated by dkramer on March 15, 1997)
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved
Please send any comments or corrections to john.rose@eng.sun.com