Swing JTextArea多线程问题 - InterruptedException
我有一个简单的控制台应用程序,它在几个线程中运行计算(其中10-20个)。现在我正在尝试创建一个简单的GUI,允许我选择要处理的文件并打印来自所有线程的日志。
因此,我使用JTextArea为我的日志创建了一个swing 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的新手,所以我无法理解我在这里做错了什么?
提前致谢。
没有找到相关结果
已邀请:
4 个回复
碉罕城爸
氏脑
祁澈盘哼颗
有时会抛出InterruptedException 我刚陷入同样的境地,不知道如何处理它。当我中断线程,然后
没有抛出这种错误。 其他人并不十分正确地将所有内容放入EDT主题。
方法是线程安全的,所以不需要包装。你不应该调用的唯一方法(在工作线程中)是
。那你为什么接受
答案呢?可能是因为将文档访问放在一个线程中会删除所有锁定问题。参见
打开的jdk代码,这解释了一下这个
。 所以看起来在EDT线程中放置
写入是非常必要的,但只有在想要中断线程时才会这样。作为一种非常不友善的行为的解决方法,在这种情况下会引发
。 我为
提出了以下解决方法。它不是很干净,因为在设置
标志后,线程可能会被中断。但这可以通过以受控的同步方式执行
来避免。
方法有时会在等待锁定时出现死锁 这是我的插入符号更新解决方案。我可以简单地使用
,但我想避免多余的调用,所以我添加了一个额外的标志:
埃输林桨铃
如果滚动窗格不可用,则使用caret-method,其中可以指定限制以最小化swing代码内部死锁的风险。