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

需要刷新Java EDT(事件调度队列),java,queue,swt,event-dispatch-thread,dispatch,Java,Queue,Swt,Event Dispatch Thread,Dispatch,我有一个Java应用程序,其中许多线程正在快速写入StyledTextBox。在某个时刻,所有线程都被终止。但是,TextBox会继续接收文本一段时间,可能是因为调度队列备份了一段时间。是否有可能以某种方式强制刷新EDT,以便当线程终止时,对文本框的更新立即结束 谢谢,, Jim使用队列应用更改后的文本,在返回之前安排事件并清空队列。一旦线程完成并在EDT上运行另一个计划的事件,这将导致“空”事件 您可以push()您自己的EventQueue子类,如图所示,并添加您自己的flush()方法来清

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

谢谢,,
Jim

使用队列应用更改后的文本,在返回之前安排事件并清空队列。一旦线程完成并在EDT上运行另一个计划的事件,这将导致“空”事件

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

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

txtOutput
StyledText
控件。
endingThreads
是一个
boolean
值,当线程终止时设置为
true

这似乎是处理SWT应用程序中问题的最简单方法

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

谢谢你的回复。如果无法直接刷新事件队列,那么我需要实现一个类似于您建议的解决方案。感谢您的回复。这种方法也适用于SWT应用程序吗?啊,我没有将
StyledTextBox
识别为SWT组件;我同意你添加标签。好的,SWT不使用
EventQueue
。是的,您的行是等效的,而且更简洁。