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:请参阅源代码。修改后的程序在中心的Flipper2doInBackground循环中添加了延迟:
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确保在任务取消时发送中断。