【发布时间】:2011-05-29 07:10:25
【问题描述】:
我有一个简单的控制台应用程序,它在多个线程(其中 10-20 个)中运行计算。现在我正在尝试创建一个简单的 GUI,它允许我选择要处理的文件并打印来自所有线程的日志。
所以,我为我的日志创建了一个带有 JTextArea 的摇摆 GUI 和一个将信息记录到日志的方法:
public synchronized void log(String text) {
logArea.append(text);
logArea.append("\n");
if (logArea.getDocument().getLength() > 50000) {
try {
logArea.getDocument().remove(0,5000);
} catch (BadLocationException e) {
log.error("Can't clean log", e);
}
}
logArea.setCaretPosition(logArea.getDocument().getLength());
}
但是,setCaretPosition 方法有时会在等待某个锁时死锁,而 append 有时会抛出 InterruptedException。
Exception in thread "Thread-401" java.lang.Error: Interrupted attempt to aquire write lock
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1334)
at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:687)
at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)
at javax.swing.JTextArea.append(JTextArea.java:470)
at lt.quarko.aquila.scripts.ui.ScriptSessionFrame.log(ScriptSessionFrame.java:215)
我是 Swing 的新手,所以我不明白我在这里做错了什么?
提前致谢。
【问题讨论】:
标签: java multithreading swing