title: Java Thread join problem
body: <pre><code>public void setGifImage(InputStream inputStream) {
          checkWidget();
          if (thread != null) {
              thread.stopRunning();
              try {
                  thread.join();
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
  
          ImageLoader loader = new ImageLoader();
  
          try {
              loader.load(inputStream);
          } catch (Exception e) {
              this.image = null;
              return;
          }
  
          if (loader.data[0] != null){
              System.out.println("set to new picture");
              this.image = new Image(this.getDisplay(), loader.data[0]);
          }
  
          if (loader.data.length &gt; 1) {
              System.out.println("start animation");
              thread = new GifThread(loader);
              thread.start();
          }else{
              System.out.println("paint static picture");
          }
  
          redraw();
      }
  </code></pre>
  
  <p>the thread :<br /></p>
  
  <pre><code>private class GifThread extends Thread {
  
          private int imageNumber = 0;
          private ImageLoader loader = null;
          private boolean run = true;
  
          public GifThread(ImageLoader loader) {
              this.loader = loader;
          }
  
          public void run() {
              while (run) {
                  int delayTime = loader.data[imageNumber].delayTime;
                  try {
                      Thread.sleep(delayTime * 10);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  if (!GifCLabel.this.isDisposed()) {
                      // if a asynchronous thread is running, this new runnable will be queued
                      GifCLabel.this.getDisplay().asyncExec(new Runnable() {
                          public void run() {
                              if (!GifCLabel.this.isDisposed()) {
                                  imageNumber = imageNumber == loader.data.length - 1 ? 0 : imageNumber + 1;
                                  if (!GifCLabel.this.image.isDisposed())
                                      GifCLabel.this.image.dispose();
                                  ImageData nextFrameData = loader.data[imageNumber];
                                  System.out.println("set to frame " + imageNumber);
                                  GifCLabel.this.image = new Image(GifCLabel.this.getDisplay(), nextFrameData);
                                  GifCLabel.this.redraw();
                              } else
                                  stopRunning();
                          }
                      });
                  } else
                      stopRunning();
              }
          }
  
          public void stopRunning() {
              run = false;
          }
      }
  </code></pre>
  
  <p>the output :<br /></p>
  
  <pre><code>2011-08-10 03:44:24 DEBUG  - 日志服务Ready!
  2011-08-10 03:44:28 DEBUG  - current is null
  2011-08-10 03:44:28 DEBUG  - found : amarsoft.dbmp.function.ui.FunctionListPage@1079ff
  2011-08-10 03:44:28 DEBUG  - can go back ? false
  2011-08-10 03:44:28 DEBUG  - can go forward ? false
  set to new picture
  start animation
  2011-08-10 03:44:28 DEBUG  - 尝试连接至 - jdbc:mysql://localhost:3306/credit 驱动配置：MySQL 驱动类：com.mysql.jdbc.Driver@1f7abae 连接属性：{user=root, password=root}
  set to frame 1
  set to frame 2
  set to frame 3
  set to frame 4
  [amarsoft.dbmp.function.ui.FunctionListPage$1@29f93b, amarsoft.dbmp.function.ui.FunctionView$1@1a998c7]
  set to new picture
  paint static picture
  set to frame 5
  </code></pre>
  
  <p>I wonder why the thread still run after thread.join()? As I know, thread.join() wait thread to die,but you can see the last line in output, thread run after die... </p>