什么是事件调度线程?

Rom*_*man 6 java user-interface multithreading

我知道"线程"意味着什么,如果我将事件调度线程(EDT)理解为"只是一个线程",它解释了很多,但显然,它并没有解释所有内容.

我不明白这个帖子有什么特别之处.例如,我不明白为什么我们应该在EDT中启动GUI?为什么"主"线程适合GUI?好吧,如果我们只是不想占用主线程为什么我们不能在"另一个线程"中启动GUI为什么它应该是一些称为EDT的"特殊"线程?

然后我不明白为什么我们不能像任何其他线程一样启动EDT?为什么我们应该使用一些特殊工具(称为invokeLater).而且,与其他任何线程不同,GUI不能立即启动.我们应该等到它准备接受我们的工作.是因为EDT可以同时执行多项任务吗?

如果你决定回答这个问题,你能否请求使用一个非常简单的术语,否则,我恐怕无法理解答案.

添加:

我一直以为每个帖子都有一个"任务".因此,在每个线程中,我们执行预定义的命令序列.但在我看来,在事件调度线程中我们可以拥有服务器任务.好吧,它们不是同时执行的(线程在不同的任务之间切换,但在一个线程中仍然有几个任务).这样对吗?例如,EDT中有一个显示主窗口的线程,然后另外我们向EDT发送了另一个应该更新其中一个窗口组件的任务,EDT将在它准备就绪时执行这个新任务.EDT是否与其他线程不同?

paj*_*ton 6

事件调度线程是处理所有GUI事件并管理Swing GUI的线程.如果您的程序中有任何GUI,它将在Swing代码中的某个位置启动.它在幕后完成的原因是因为简单 - 您不必费心自己启动和管理额外的线程.

关于必须使用invokeLater()它更新GUI的事实是因为并发问题.GUI只能从一个线程修改,因为Swing不是线程安全的(值得注意的是,大多数工具包都不是线程安全的,有一篇很好的文章提供了一些想法).这就是为什么你必须提交所有GUI更新才能在EDT上运行.

您可以在Swing中的并发性和事件调度线程中阅读有关Swing中并发性的Sun教程中的更多信息.此外,如果您想了解如何以不同的方式完成此操作,您可能需要查看SWT工具包.在SWT中,您必须自己管理EDT.


Mic*_*rdt 6

我一直以为每个帖子都有一个"任务".因此,在每个线程中,我们执行预定义的命令序列.但在我看来,在事件调度线程中我们可以拥有服务器任务.好吧,它们不是同时执行的(线程在不同的任务之间切换,但在一个线程中仍然有几个任务).这样对吗?例如,EDT中有一个显示主窗口的线程,然后另外我们向EDT发送了另一个应该更新其中一个窗口组件的任务,EDT将在它准备就绪时执行这个新任务.EDT是否与其他线程不同?

不,EDT与其他线程没有根本的区别.并且"任务"不是一个好用的词,因为它可能与OS级进程(通常也称为任务)混淆.更好的使用Runnable,用于为EDT执行代码的接口invokeLater().

EDT基本上连接到它必须做的事情的队列.当用户单击GUI上的按钮时Runnable,通知连接到该按钮的所有侦听器都会进入队列.调整窗口大小时,Runnable执行重新验证和重新绘制将进入队列.当你使用时invokeLater(),你Runnable进入队列.

EDT只是运行一个无限循环,说" Runnable从队列中取出(如果它是空的睡眠,直到你被告知它不是)并执行它.

因此,它Runnable一个接一个地执行所有这些小块代码,因此它们中的每一个在运行时基本上都具有GUI,并且不必担心同步任何东西.当您从另一个线程操作GUI时,此假设被破坏,您最终可能会在损坏的状态下使用GUI.