如何解决java中的无效线程访问

时间:2014-08-25 06:10:26

标签: java multithreading swt

我正在使用SWT开发一个java应用程序。我已经使用JNativeHook Library实现了HotKeyFunction。它全局监听热键,即当应用程序也不在焦点时。我必须在按下热键时使应用程序处于焦点。所以我试图使用shell.setFocus(),shell.forceFocus()。但我得到一个“无效的线程访问”异常。看看文档,它显示

  

抛出:

     

SWTException -   ERROR_WIDGET_DISPOSED - 如果接收器已被丢弃   ERROR_THREAD_INVALID_ACCESS - 如果没有从创建接收器的线程调用

对于这两个函数。我知道JNativeHook使用另一个线程来监听密钥,我试图从该线程调用这些方法但是shell已经使用主线程创建了。现在我如何调用这些方法主线程。我对线程知识非常少。

PS:我没有在任何地方明确创建任何线程。

1 个答案:

答案 0 :(得分:2)

您需要使用Display.asyncExecDisplay.syncExec方法。您可以使用Display.getDefault获取Display实例,或者从UI对象获取它并将其传递给您的主题。

   // do something on the UI thread asynchronously
   Display.getDefault().asyncExec(new Runnable() {
      public void run() {
         // access to UI
      }
   });

   // do something on the UI thread synchronously
   Display.getDefault().syncExec(new Runnable() {
      public void run() {
         // access to UI
      }
   });