2010-12-09 98 views
6

我已經實現了一個Runnable接口來加載圖像切片,我想從這個輔助線程調用主線程來顯示切片。 任何人都可以告訴我如何從Java中的Runnable接口線程調用主線程。從java中的Runnable線程調用主線程

謝謝。

+0

從主線程調用其他線程通常是很好的設計。 – 2010-12-09 10:40:57

+0

@ org.life.java,當你說「調用另一個線程」時,你(和OP)是什麼意思? – aioobe 2010-12-09 10:42:51

+0

@aioobe我認爲OP想從另一個從main開始的線程調用主線程。像http://ideone.com/G8gLN – 2010-12-09 10:45:40

回答

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

你是什麼意思的「調用線程」?

您可能想以某種方式「通知」主線程圖像已加載。你可以通過例如讓負載線程的主線程wait()notify()來確定圖像已經加載。

但是,最好使用java.util.concurrent包中更「高級」的併發類之一。例如BorisPavlović建議的CallableFuturethe documentation of Future中有一個示例用法。

0

你真的不能 「呼」 從另一個一個線程。你可以做的是有一個消息隊列:輔助線程會將消息放入隊列中,主線程會從隊列中選取它們並處理。

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

如果你需要它是可伸縮的,那麼我建議交換到一些事件總線模式的實現。例如:http://code.google.com/p/simpleeventbus/

事件總線與我在示例中寫的一樣,但是非常具有可擴展性。主要區別是你可以管理各種事件並且一次註冊很多聽衆。

相關問題