Java,正确使用等待和通知来暂停另一个线程的线程执行

标签 java multithreading swing

我在尝试从另一个线程暂停线程执行时遇到问题。我已经阅读了 java 文档和一些堆栈溢出示例,但似乎仍然有点迷失。

很多情况都和我一样;我有一个 gui,它生成一个线程来完成一些工作,以便它可以保持对用户的响应。在某些时候,用户做了一些事情,需要在执行下一条语句之前停止工作线程。然后一段时间后,继续其工作。

我已经阅读了 Threadswaitnotify 文档,这似乎是上述问题的简短答案(?) .

根据我的 IDE (netbeans) 告诉我的,我必须在同步块(synchronized block)内调用 waitnotify

这就是按下开始暂停按钮时 JFrame 中的内容。 automator 是我想要暂停的 Thread 对象。它在我的 JFrame 中声明为 static finalfirstRunDone 只是第一次按下 m_jbStartPause 时的一个标志,因此可以启动 automator 而不会收到通知。

OnStartPauseButton()
{
    synchronized(automator)
    {
         if(!running)
         {
              this.m_jbStartPause.setText("Pause");
              running = true;
              if(firstRunDone)
                  automator.notify();
              else
                  automator.start();
              firstRunDone = true;
         }
         else 
         {
             this.m_jbStartPause.setText("Start");
             running = false;
             try { automator.wait(); }  catch (InterruptedException ex) {}
         }
    }
}

我的问题是当我第一次尝试暂停线程时。我可以点击开始,自动机启动,但是当我点击暂停时,发生的只是 JFrame 卡住,而自动机继续工作。

我使用同步错误吗? automator需要任何处理代码吗?

最佳答案

  • 你最好使用SwingUtilities.invokeLater为了更新 UI 而不是使用工作线程

  • 如果您需要“取消”线程,则需要将“正在运行”标志设置为 volatile

  • 我建议使用 ReentrantLock 而不是使用“同步”以及它的条件

关于Java,正确使用等待和通知来暂停另一个线程的线程执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18579906/

相关文章:

c - C Unix 中的段错误(核心转储)

java - 我想立即更改按钮的图标

java - 更改 JSlider 的单位移动

java - 不同的应用程序服务器实现可以共享远程 EJB 吗?

java - 字段变量产生与递归局部变量不同的结果

c# - 将(多个)文件复制到多个位置

c# - 线程、列表和循环不是一个好主意吗?

Java:将 JTable 中的 HTML 代码显示为纯文本

java - 空检查 + 取消引用在同一行

java - Java HashMap 内部如何存储条目