我已经实现了一个Runnable接口来加载图像切片,我想从这个辅助线程调用主线程来显示切片。 任何人都可以告诉我如何从Java中的Runnable接口线程调用主线程。
感谢。
答案 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ć建议的Callable
和Future
。 the 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/
事件总线通常与我在我的示例中编写的相同,但非常可扩展。主要区别在于您可以管理各种事件并一次注册大量的听众。