从ActionPerformed调用方法并在主线程上运行它

时间:2017-05-16 16:55:17

标签: java multithreading swing semaphore

按下JButton后,我的程序的UI冻结了一段时间。我发现造成这种情况的原因是信号量堵塞了Swing线程。这是包含信号量noexcept调用的方法:

void SetString(const std::string& val) 
         noexcept(std::is_nothrow_copy_assignable<std::string>::value) {
}

这是调用acquire()

的唯一方法
  private void fetch(int numThreads) {
    //some code here
    sem = new Semaphore(numThreads);
    for (int i = 0; i < model.getRowCount(); i++){
      try {
        sem.acquire();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
     //some code here
    }

据我了解,此代码最终在Swing线程上运行fetch(),但据推测它与Swing无关。

我想,我的问题是:如何运行一个名为&#39; ActionPerformed()&#39; Swing在程序的主线程上而不是Swing线程?

1 个答案:

答案 0 :(得分:0)

无需专门在&#34; main&#34;线。只需在任何其他线程上运行它,但需要在Swing UI线程上运行。

到达那里的最简单的解决方案:

  • 向您的班级添加ExecutorService
  • 将代码fetch(Integer.parseInt(threadsNumField.getText()));放入Runnable对象
  • 将Runnable提交给ExecutorService

遵循:

private final ExecutorService executorService = Executors.newSingleThreadExecutor();

executorService.execute(new Runnable() {
 public void run() {
   fetch(Integer.parseInt(threadsNumField.getText()));
 }
});