2012-02-14 96 views
0

让我在提问之前发布一些代码。Java:等待线程结果而不阻塞UI?

public Object returnSomeResult() { 
    Object o = new Object(); 
    Thread thread = new Thread(this); 
    thread.start(); 
    return o; 
} 

public void run() { 
    // Modify o. 
} 

所以,从UI线程调用方法returnSomeResult;它启动另一个线程。现在,我需要等到线程完成计算。而且,与此同时,我不想阻止UI线程。如果我更改代码如下所示; UI线程被阻塞。

public Object returnSomeResult() { 
    Object o = new Object(); 
    Thread thread = new Thread(this); 
    thread.start(); 
    try { 
     synchronized(this) { 
      wait(); 
     } 
    catch(Exception e) { 
    } 
    return o; 
} 

public void run() { 
    // Modify o. 
    try { 
     synchronized(this) { 
      notify(); 
     } 
    catch(Exception e) { 
    } 
} 

我相信,因为我使用synchronized(this),它导致UI线程被阻塞。我如何在不阻止UI线程的情况下如此呢?

+5

封闭的自定义代码和等待是同义的。你不能吃你的蛋糕,也不能吃。 – SLaks 2012-02-14 01:48:49

回答

3

可以使用swingworker

public SwingWorker<Object,Void> returnSomeResult() { 
    SwingWorker<Object,Void> w = new SwingWorker(){ 
     protected Void doInBackground(){ 
      Object o; 
      //compute o in background thread 
      return o; 
     } 
     protected void done(){ 
      Object o=get(); 
      //do something with o in the event thread 
     } 
    } 
    w.execute(); 
    return w;//if you want to do something with it 
} 

你可以添加一个参数根据呼叫者