2013-02-01 30 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(); 
} 
}