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

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

如果多个线程正在读取和写入共享值,那么必须有某种同步,否则它们可能会处理陈旧的值。您可以使用原子类之一,例如AtomicBooleanor AtomicInteger,使用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);
于 2012-04-05T12:49:09.253 回答