需要刷新Java EDT(事件调度队列)

时间:2012-02-08 00:41:58

标签: java queue swt event-dispatch-thread dispatch

我有一个Java应用程序,其中许多线程正在快速写入StyledTextBox。在某些时候,所有线程都被终止。但是,TextBox继续接收一些文本,大概是因为调度队列有点备份。是否有可能以某种方式强制刷新EDT,以便在线程终止时对TextBox的更新立即结束?

谢谢你, 吉姆

3 个答案:

答案 0 :(得分:5)

您可以push()您自己的EventQueue子类,如图所示here,并添加您自己的flush()方法来清空队列。请注意,如果队列为空,getNextEvent()会阻塞,因此请先检查peekEvent()

答案 1 :(得分:2)

使用队列来应用已更改的文本,在返回之前将事件安排在队列为空的EDT中。一旦线程结束并且EDT上的另一个预定事件运行,这将导致“空”事件。

答案 2 :(得分:1)

好的,我找到了解决方案。我们的想法是安装一个“验证”监听器,只要将文本添加到StyledText,就会调用该监听器。因此,当即将添加文本时(从备份的调度队列中),代码会查找要设置的标志,指示线程是否已被终止。如果线程已终止,则忽略文本更新。这允许控件在允许排空事件队列的同时停止更新。以下代码段解决了这个问题。

txtOutputStyledText控件 当线程被终止时,endingThreadsboolean设置为true 这似乎是在SWT应用程序中处理问题的最简单方法。

        txtOutput.addVerifyListener(new VerifyListener() {
        public void verifyText(VerifyEvent e)
        {
            if( !endingThreads )
            {
                e.doit = true;
            }
            else
            {
                e.doit = false;
            }
        }
    });