从java中的Runnable线程调用主线程

时间:2010-12-09 10:37:51

标签: java multithreading

我已经实现了一个Runnable接口来加载图像切片,我想从这个辅助线程调用主线程来显示切片。 任何人都可以告诉我如何从Java中的Runnable接口线程调用主线程。

感谢。

4 个答案:

答案 0 :(得分:4)

您可以使用Runnable而不是Callable<Set<Image>>来返回一组已加载的图像。将此可调用任务提交给执行程序,获取Future<Set<Image>>并等待加载线程完成其工作。

例如:

Future<Set<Image>> future =
  Executors.newSingleThreadExecutor().submit(new Callable<Set<Image>>()
    {
      @Override
      public Set<Image> call() throws Exception
      {
        return someServiceThatLoadsImages.load();
      }
    });

try
{
  Set<Image> images = future.get();
  display(images);
} catch (Exception e)
{
  logger.error("Something bad happened", e);
}

答案 1 :(得分:0)

你叫“线程”是什么意思?

您可能希望以某种方式“通知”主要线程已加载图像。你可以通过例如让加载线程的主线程wait()notify()来加载图像。

但是,最好在java.util.concurrent包中使用一个更“高级”的并发类。例如,BorisPavlović建议的CallableFuturethe documentation of Future中有一个示例用法。

答案 2 :(得分:0)

你无法真正从另一个线程“调用”一个线程。你可以做的是拥有一个消息队列:辅助线程将消息放入队列,主线程将从队列和进程中取出它们。

答案 3 :(得分:-1)

我认为通过“调用线程”,作者意味着从工作线程到主线程的某种回调,以通知它某种事件。

有很多方法可以实现这种回调,但我会使用一个简单的监听器接口。像这样:

//Interface of the listener that listens to image load events
public interface ImageLoadListener {
 void onImageLoadSuccess(ImageInformation image);
 void onImageLoadFailed(ImageInformation image);
}

//Worker thread that loads images and notifies the listener about success
public class ImageLoader implements Runnable {
 private final ImageLoadListener loadListener;
 public ImageLoader(ImageLoadListener listener) {
  this.loadListener = listener;
 }

 public void run() {
  ....
  for (each image to load) {
   ....
   if (load(image)) {
    if (loadListener != null) {
     loadListener.onImageLoadSuccess(image);
    }
   } else {
    if (loadListener != null) {
     loadListener.onImageLoadFailed(image);
    }
   }   
  }
 }
}

//Main class that creates working threads and processes loaded images
public class MainClass {
 ...

 //Main method for processing loaded image
 void showImageAfterLoad(ImageInformation information) {
  ...
 }

 //Some button that should create the worker thread
 void onSomeButtonClick() {
  //Instantiate the listener interface. If image load is successful - run showImageAfterLoad function on MainClass
  ImageLoadListener listener = new ImageLoadListener() {
   void onImageLoadSuccess(ImageInformation image) {
    MainClass.this.showImageAfterLoad(image);
   }
   void onImageLoadFailed(ImageInformation image) {
    //Do nothing
   }
  };

  //Create loader and it's thread
  ImageLoader loader = new ImageLoader(listener);
  new Thread(loader).start();
 }
}

如果您需要它可扩展,那么我建议交换一些Event Bus模式的实现。例如:http://code.google.com/p/simpleeventbus/

事件总线通常与我在我的示例中编写的相同,但非常可扩展。主要区别在于您可以管理各种事件并一次注册大量的听众。