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

如何解决java中的无效线程访问,java,multithreading,swt,Java,Multithreading,Swt,我正在使用SWT开发一个java应用程序。我已经使用JNativeHook库实现了热键函数。它全局侦听热键,即当应用程序未处于焦点时。当按下热键时,我必须使应用程序处于焦点。因此我尝试使用shell.setFocus()、shell.forceFocus()。但我得到了“无效线程访问”例外。查看文档,它显示 抛出: SWTException- 错误\u WIDGET\u DISPOSED-如果接收器已被释放 错误\u线程\u无效\u访问-如果不是从创建接收器的线程调用 对于这两个函数。我知道JN

我正在使用SWT开发一个java应用程序。我已经使用JNativeHook库实现了热键函数。它全局侦听热键,即当应用程序未处于焦点时。当按下热键时,我必须使应用程序处于焦点。因此我尝试使用shell.setFocus()、shell.forceFocus()。但我得到了“无效线程访问”例外。查看文档,它显示

抛出:

SWTException- 错误\u WIDGET\u DISPOSED-如果接收器已被释放 错误\u线程\u无效\u访问-如果不是从创建接收器的线程调用

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


PS:我没有在任何地方显式创建任何线程。

您需要使用
Display.asynceec
Display.syncExec
方法。您可以使用
Display.getDefault
访问显示实例,或者从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
      }
   });