我有一个正在运行并重复执行任务的线程。我已经实现了一个计数器来向我展示线程执行的任务的迭代。我时不时地看到计数器卡在某个地方并且它不再增加。我没有收到任何错误或例外。该应用程序运行但看起来线程刚刚停止而没有我问它。
我将添加一些代码来显示线程执行:
注意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);
}
答案 0 :(得分:1)
检查线程被另一个线程中断。在catch块中打印堆栈跟踪并验证它。
try {
Thread.sleep(5000);
// Task.initializeIt();
} catch (InterruptedException ie) {
// break; // just ignore it
}
答案 1 :(得分:0)
我没有看到killcheck
或c
的定义,但这些定义可能没有标记为volatile
?
如果多个线程正在读取和写入共享值,则必须存在某种同步,否则它们可能正在处理过时值。您可以使用其中一个原子类,例如AtomicBoolean
或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);