Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
问题1:对于以下每个任务,指定应在哪个线程中执行以及为什么。
答案1:
javax.swing.JComponent.setFont
更改组件的字体。事件分派线程。与大多数Swing方法一样,不安全从任何其他线程调用setFont
。javax.swing.text.JTextComponent.setText
更改组件的文本。该方法在文档中标记为线程安全,因此可以从任何线程调用。问题2:没有任何任务首选的线程属于前面提到的问题。给这个线程命名并解释为什么它的应用非常有限。
答案2:初始线程在事件分派线程上启动第一个GUI任务。之后,Swing程序主要由GUI事件驱动,触发事件分派线程和工作线程上的任务。通常,初始线程没有其他任务可执行。
问题3:SwingWorker
有两个类型参数。解释这些类型参数的使用方式,以及它们通常是什么并不重要。
答案3:类型参数指定最终结果的类型(也是doInBackground
方法的返回类型)和中间结果的类型(也是publish
和process
的参数类型)。许多后台任务不提供最终或中间结果。
问题1:修改
示例,使其在"翻转硬币"之间暂停5秒钟。如果用户点击"取消",则硬币翻转循环立即终止。Flipper
答案1:请参阅源代码
。修改后的程序在中心的Flipper2
doInBackground
循环中添加了延迟:
protected Object doInBackground() { long heads = 0; long total = 0; Random random = new Random(); while (!isCancelled()) { try { Thread.sleep(5000); } catch (InterruptedException e) { //已取消! return null; } total++; if (random.nextBoolean()) { heads++; } publish(new FlipPair(heads, total)); } return null; }
try ... catch
在线程睡眠时接收到中断时使doInBackground
返回。使用参数true
调用cancel
确保在任务取消时发送中断。