0

別のスレッドからのスレッドの実行を一時停止しようとすると問題が発生します。私は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必要ですか?

4

2 に答える 2

1
  • ワーカー スレッドを使用する代わりに、UI を更新するためにSwingUtilities.invokeLaterを使用することをお勧めします。

  • スレッドを「キャンセル」する必要がある場合は、「実行中」フラグを揮発性にする必要があります

  • 「同期」を使用する代わりに、ReentrantLockを使用することをお勧めします。

于 2013-09-02T20:25:23.167 に答える