2012-03-22 45 views
2

Javaでいくつかのジョブを実行するスレッドを起動し、JTableJProgressBarに更新するアプリを開発しています。 私はいくつかのJMenuItemJTableJPopupMenu develope:だから私はそれを行うことができるようにしたいJavaでスレッドを停止、一時停止、キャンセルする方法

  • ポーズ
  • 停止
  • 再開

をキャンセルします。

ユーザーがJTableに新しいスレッドを追加すると、私はArrayList<Thread>にスレッドを保存するので、私は

stop.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 

      } 
     }); 

やその他を実装する必要があります。..

ので、私は持っているという仮説を、してみてください現在のスレッドのインデックス:

Thread t = working.get(selectedThread); //where working is my `ArrayList<Thread>` 
t.interrupt(); 

何も...それは仕事を続ける... ので、私は試してみてください。

try { 
         working.get(actualRow).wait(); 
        } catch (InterruptedException ex) { 
         Logger.getLogger(PannelloRicerca.class.getName()).log(Level.SEVERE, null, ex); 
        } 

が、それは私にwait()IllegalStateMonitorExceptionを取得するので、私が行う方法がわからない...誰かが私を助けることができますか?

+0

waitを呼び出すには、working.get(actualRow)オブジェクトをロックする必要があります。それがIllegalStateMonitorExceptionを取得している理由です。 waitはsynchronizedブロックまたはsynchronizedメソッドから呼び出すことができます。スレッドで割り込み呼び出しを使用する代わりに、スレッドの変数を設定してスレッドに通知を送信します。スレッドではこの値を使用して実行を停止します。 – Delta

答えて

1

Thread.interrupt()コールはThreadに割り込みビットをセットし、それがInterruptedExceptionをスローするように任意のwaitsleep呼び出しが発生します。多くの期待どおりにスレッドの実行をキャンセルしません。

あなたは、このようなスレッドに割り込みビットのためにテストすることができます。人々は、スレッドを停止するための

while (!Thread.currentThread().isInterrupted()) { 
    ... 
} 

典型的な方法は、AtomicBoolean(またはvolatile boolean)を持っており、のような何かを行うことです。

AtomicBoolean running = new AtomicBoolean(true); 
while (running.set()) { 
    ... 
} 

... 
// then in the other thread (like the main thread) you stop the thread by: 
runner.set(false); 

あなたはあなたが待っているオブジェクトの​​ブロックの内側にすることなく、waitを呼び出しているので、あなたはIllegalStateMonitorExceptionを得ています。私はそれはあなたが望むものだか分からないが、

Thread t = working.get(actualRow); 
synchronized (t) { 
    t.wait(); 
} 

:あなたのような何かをする必要があります。多分あなたはそれが完了するのを待つスレッドに参加したいですか?

working.get(actualRow).join(); 
+0

問題は、私のiスレッドのジョブ(つまり、togheterが働いているスレッドが多いことを意味します)は、2つの入れ子にされたループの中のhtmlページを解析することです。だから私はあなたの条件を置くことができますか? – JackTurky

+0

@Jackの目標は何ですか?このhtmlページの処理を停止しようとしていますか?あなたは明らかに毎回そうすることができます。 – Gray

+1

いいえ..私は良い説明していない..私はJTableとJComboBoxを持っているJpanelを持っています。ユーザーはJComboboxへのオブジェクトを選択してから、JButtonをクリックするとスレッドを起動できます。このスレッドは、最初にJTableを更新し、内部にいくつかのテキストとJProgressBar(開始されたばかりのスレッドによって操作される)を持つ行を追加した後、JTableに挿入された行の中のすべてのページ、テキスト、JProgressBarの値、 。ユーザーは多くのスレッドを起動することができますし、JTableの行のマウスの右ボタンでクリックすると、私の記事に記載されているJPopupMenuが表示されます。 – JackTurky

1

IllegalStateMonitorExceptionスレッドが唯一のそれはそれは所有している 'オブジェクトに待つことができるので、それは(それが正しい用語であるならば、私は覚えていない)です。

他の誰もこのオブジェクトをすでに待機していないようにするには、最初に同じオブジェクトで同期する必要があります。

synchronize (working.get(actualRow)) { 
    working.get(actualRow).wait(); 
} 
+0

このようにすべてのスレッドをブロックします。 – JackTurky

+0

すべてのGUI – JackTurky

+0

指定されたオブジェクトの同期セクションには、いずれかのスレッドしか存在できません。別のスレッドが同じオブジェクトと同期しようとするオブジェクトで同期を行うと、最初のスレッドが同期ブロックを離れるまで、2番目のスレッドは停止します。これはまさに同期の目的です。問題をブロックせずに待機するだけなら、別のオブジェクト(新しく作成されたオブジェクト、または独自のThreadオブジェクト)を使用して各スレッドを同期させることができます。 – SJuan76

関連する問題