0

タスクを繰り返し実行しているスレッドがあります。スレッドによって実行されたタスクの反復を表示するためのカウンターを実装しました。時々、カウンターがどこかで動かなくなって、もう増えていないのがわかります。エラーや例外は発生しません。アプリケーションは実行されますが、スレッドが停止したように見えます。

スレッドの実行を示すコードを追加します。

int"c"に注意してください-それは反復のカウンターです。

public void check() {
    Thread check = new Thread() {
        public void run() {

            for (;;) {
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        // Update GUI here on EventQueue.

                        try {
                            Task.readTasks();
                        } catch (InvalidFormatException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        if (NoteInfo == null || NoteInfo == "") {
                            btnViewNote.setEnabled(false);
                        } else {

                            btnViewNote.setEnabled(true);
                        }

                        textField.setText(Task.printNextTask);
                        c++;
                        lblCycle.setText("Cycle: " + c);

                    }
                });

                try {
                    Thread.sleep(5000);
                    // Task.initializeIt();
                } catch (InterruptedException ie) {
                    break;
                }
                if (killcheck)
                    break;

            }
        }
    };
    check.start();
}

public static void stopChecking() {
    killcheck = true;
    progressBar.setValue(0);
    textArea.setText("");
    textField.setText("");
    c = 0;
    lblCycle.setText("Cycle: " + c);

}
4

2 に答える 2

1

チェック スレッドが別のスレッドによって中断されます。catch ブロックのスタック トレースを出力して確認します。

  try {     
       Thread.sleep(5000);
       // Task.initializeIt();
  } catch (InterruptedException ie) {    
          //   break;          // just ignore it
  } 
于 2012-04-05T08:41:36.323 に答える
0

killcheckまたはの定義が表示されませんが、これらが?cとしてマークされていない可能性があります。volatile

複数のスレッドが共有値の読み取りと書き込みを行っている場合は、何らかの同期が必要です。そうでない場合、古い値を処理している可能性があります。AtomicBooleanまたはなどのアトミッククラスの1つを使用するか、キーワードをAtomicInteger使用するか、変数を。としてマークすることができます。3つすべてで、メインスレッドとインナースレッドが共有フィールドに対する互いの変更を確認できるようになります。synchronizedvolatile

volatile int c;
volatile boolean killcheck;

後世のために、アトミッククラスの使用方法は次のとおりです。

 final AtomicInteger c = new AtomicInteger();
 final AtomicBoolean killcheck = new AtomicBoolean();
 ...
         c.incrementAndGet();
 ...
         if (killcheck)
             break;
 ...
         killcheck.set(true);
 ...
         c.set(0);
于 2012-04-05T12:49:09.253 に答える