线程不经意地停止

时间:2012-04-05 08:33:23

标签: java multithreading

我有一个正在运行并重复执行任务的线程。我已经实现了一个计数器来向我展示线程执行的任务的迭代。我时不时地看到计数器卡在某个地方并且它不再增加。我没有收到任何错误或例外。该应用程序运行但看起来线程刚刚停止而没有我问它。

我将添加一些代码来显示线程执行:

注意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);

}

2 个答案:

答案 0 :(得分:1)

检查线程被另一个线程中断。在catch块中打印堆栈跟踪并验证它。

  try {     
       Thread.sleep(5000);
       // Task.initializeIt();
  } catch (InterruptedException ie) {    
          //   break;          // just ignore it
  } 

答案 1 :(得分:0)

我没有看到killcheckc的定义,但这些定义可能没有标记为volatile

如果多个线程正在读取和写入共享值,则必须存在某种同步,否则它们可能正在处理过时值。您可以使用其中一个原子类,例如AtomicBooleanAtomicInteger,使用synchronized关键字,或将变量标记为volatile。所有这三个都允许主线程和内部线程看到彼此对共享字段的更改。

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);