我已經實現了一個Runnable接口來加載圖像切片,我想從這個輔助線程調用主線程來顯示切片。 任何人都可以告訴我如何從Java中的Runnable接口線程調用主線程。從java中的Runnable線程調用主線程
謝謝。
我已經實現了一個Runnable接口來加載圖像切片,我想從這個輔助線程調用主線程來顯示切片。 任何人都可以告訴我如何從Java中的Runnable接口線程調用主線程。從java中的Runnable線程調用主線程
謝謝。
而不是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);
}
你是什麼意思的「調用線程」?
您可能想以某種方式「通知」主線程圖像已加載。你可以通過例如讓負載線程的主線程wait()
到notify()
來確定圖像已經加載。
但是,最好使用java.util.concurrent
包中更「高級」的併發類之一。例如BorisPavlović建議的Callable
和Future
。 the documentation of Future
中有一個示例用法。
你真的不能 「呼」 從另一個一個線程。你可以做的是有一個消息隊列:輔助線程會將消息放入隊列中,主線程會從隊列中選取它們並處理。
我認爲通過「調用線程」作者意味着從工作線程到主線程的某種回調,以通知它某種事件。
有很多方法來實現這種回調,但我會使用一個簡單的偵聽器接口。這樣的事情:
//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();
}
}
如果你需要它是可伸縮的,那麼我建議交換到一些事件總線模式的實現。例如:http://code.google.com/p/simpleeventbus/
事件總線與我在示例中寫的一樣,但是非常具有可擴展性。主要區別是你可以管理各種事件並且一次註冊很多聽衆。
從主線程調用其他線程通常是很好的設計。 – 2010-12-09 10:40:57
@ org.life.java,當你說「調用另一個線程」時,你(和OP)是什麼意思? – aioobe 2010-12-09 10:42:51
@aioobe我認爲OP想從另一個從main開始的線程調用主線程。像http://ideone.com/G8gLN – 2010-12-09 10:45:40