我在尝试从另一个线程暂停线程执行时遇到问题。我已经阅读了 java 文档和一些堆栈溢出示例,但似乎仍然有些迷茫。
很多情况和我一样;我有一个 gui,它产生一个线程来做一些工作,以便它可以保持对用户的响应。在某些时候,用户做了一些事情,希望在工作线程执行下一条语句之前停止它。然后过了一段时间,继续它的工作。
我已阅读wait
和notify
文档Threads
,这似乎是对上述问题的简短回答(?)。
根据我的 IDE(netbeans)告诉我的内容,我必须在同步块中调用wait
和。notify
因此,当按下开始暂停按钮时,这就是我在 JFrame 中的内容。automator
是我Thread
想要暂停的对象。它static final
在我的 JFrame 中声明。firstRunDone
只是第一次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
需要任何处理代码?