2013-02-01 34 views
1

我試圖從可調用的更新UI,但失敗。 爲什麼System.out.println("UI thread.");從不叫? 我正在使用SWT。圖形用戶界面線程作業不可調用

Callable<Boolean> callable = new Callable<Boolean>() { 
    @Override 
    public Boolean call() throws Exception { 
     System.out.println("Executing Callable."); 

     Display.getDefault().asyncExec(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println("UI thread."); 
      } 
     }); 

     System.out.println("End."); 
     return true; 
    } 
}; 

ExecutorService executor = Executors.newFixedThreadPool(10); 
executor.submit(callable); 
+0

您使用的是什麼GUI框架?你應該添加相關的標籤。 – assylias

+0

讓我問你,爲什麼你在另一個異步調用中包裝一個異步調用? – Perception

+0

第二個應該在UI線程上執行回調。可調用會先在另一個線程上執行一些操作。 – Skip

回答

0

問題發生了,因爲我在JunitTest中執行了上層代碼。 在可以執行異步Runnable之前,測試返回。 等待在測試結束 - 幫助!

@Test 
public void jobs() { 

    Callable<Boolean> callable = new Callable<Boolean>() { 
    @Override 
    public Boolean call() throws Exception { 
     System.out.println("Executing Callable."); 

     Display.getDefault().asyncExec(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println("UI thread."); 
      } 
     }); 

     System.out.println("End."); 
     return true; 
    } 
}; 

ExecutorService executor = Executors.newFixedThreadPool(10); 
executor.submit(callable); 

long stopTimestampt = System.currentTimeMillis() + 1000; 
while (System.currentTimeMillis() < stopTimestampt) { 
     Display.getDefault().readAndDispatch(); 
} 
}