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

标签 java multithreading swing semaphore

按下 JButton 后,我的程序的 UI 卡住了一段时间。我发现造成这种情况的原因是信号量堵塞了 Swing 线程。这是包含对信号量的 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
    }

这是唯一调用 fetch()

的方法
concFetchButt.addActionListener(new ActionListener() {

  @Override
  public void actionPerformed(ActionEvent e) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        switchButtonStates(false);
      }

    });

    fetch(Integer.parseInt(threadsNumField.getText()));
  }

据我了解,这段代码最终在 Swing 线程上运行 fetch(),不过,据说它与 Swing 无关。

我想,我的问题是这样的:如何在程序的主线程而不是 Swing 线程上运行从 Swing 的“ActionPerformed()”调用的方法?

最佳答案

无需专门在“主”线程上运行它。只需在除 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()));
 }
});

关于java - 从 ActionPerformed 调用方法并在主线程上运行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44007375/

相关文章:

c# - 在共享相同方法的多个线程中使用 Random

c++ - 如何使用 C++ 在不同的线程上调用函数?

java - 在 Swing 中使用面包屑导航

java - 现实世界中的 Clojure 和 Java 互操作

java - 在运行时转换 NIO channel

java - 为什么我的函数没有在我的程序(java)中运行?

c++ - 在 C++ std::vector 之外的线程中启动可运行对象

java - 我可以使用 Apache Pivot 而不是 Swing 吗?

java - Swing 应用程序卡住

java - 使用类字段中的 cron 表达式安排作业