在我的应用程序有一个主框架窗口GUI
,即在启动任务executor
的服务。
提交的任务generates
输出并存储in a file on Disk
。
只要O / P产生GUI(观察者)被通知的O / P产生。
这里的问题是我保持等待循环主框架内,只要收到通知,主面板重新粉刷主框架上。
对于小任务能正常工作,但由于该线程任务的大小增加。 直到计算完成后等待循环时间的增加和GUI主窗口变成黑色。
能否请你帮我纠正设计。 还如何能SwingWorker
在这种情况下,线程的帮助。
直到计算完成后等待循环时间的增加和GUI主窗口变成黑色。
然后你长时间运行的任务,在事件指派线程(EDT),它可以防止GUI重画本身执行。 你需要在一个单独的线程来执行长时间运行的任务。 甲的SwingWorker是一个单独的线程,其具有一个API,还允许当代码完成执行或当你有中间结果根据需要你对EDT执行代码,例如。
阅读从秋千上的教程部分并发了解更多信息。 您可以随时搜索论坛例如使用的SwingWorker的。
1)等待循环是所有的祸根即GUI。 他们在其他线程确定你已经产生了,在棘手的执行人(因为他们有时会对线程的数量限制,具体取决于您使用),并完全摆脱对EDT的问题。 这是你的“blackscreen”的原因
2)而不是使用自定义的(我想这是自定义的)信号协议和等待循环,您可以使用实用工具类的一个Swing中。 例如, SwingUtilities
有几个不错的方法- invokeLater
和invokeAndWait
是采取了Runnable
,并尽快,因为他们可以执行它的EDT。 使用这个,而不是你的信号可以让你不阻止EDT,让你的GUI响应。
3)如果你真的想使用SwingWorker
你可能想通过它的文档看看。 它本质上是一种方式做后台任务和报告进度或完成/导致的EDT。 目前,它使用ExecutorService
以2个后台线程,所以有很多的长时间运行的任务,他们是不是一个好主意(他们将阻止对方)。 当创建SwingWorker
,你会指定的方法来在后台运行, 对EDT跑出方法时中间结果是可用的,当你完成成功或错误的EDT将跑法。
4)本不属于手头上的问题,但如果你有机会在你需要在美国东部时间等待循环,并使用另一种设计或技术无法避免的情况下,你可以随时切换到使用Timer
。 它可以设置为每隔x毫秒,而不会阻塞EDT调用和关闭,一旦你满意一些条件。