The Java Tutorials have been written for JDK 8.Java教程是为JDK 8编写的。Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available.本页中描述的示例和实践没有利用后续版本中引入的改进,并且可能使用不再可用的技术。See Java Language Changes for a summary of updated language features in Java SE 9 and subsequent releases.有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言更改。
See JDK Release Notes for information about new features, enhancements, and removed or deprecated options for all JDK releases.有关所有JDK版本的新功能、增强功能以及已删除或不推荐的选项的信息,请参阅JDK发行说明。
Question 1: For each of the following tasks, specify which thread it should be executed in and why.
Answer 1:
javax.swing.JComponent.setFont
to change the font of a component. The event dispatch thread. As with most Swing methods, it is not safe to invoke setFont
from any other thread.javax.swing.text.JTextComponent.setText
to change the text of a component. This method is documented as thread-safe, so it can be invoked from any thread.Question 2: One thread is not the preferred thread for any of the tasks mentioned in the previous question. Name this thread and explain why its applications are so limited.
Answer 2: The initial threads launch the first GUI task on the event dispatch thread. After that, a Swing program is primarily driven by GUI events, which trigger tasks on the event dispatch thread and the worker thread. Usually, the initial threads are left with nothing to do.
Question 3: SwingWorker
has two type parameters. Explain how these type parameters are used, and why it often doesn't matter what they are.
Answer 3: The type parameters specify the type of the final result (also the return type of the doInBackground
method) and the type of interim results (also the argument types for publish
and process
). Many background tasks do not provide final or interim results.
Question 1: Modify the
example so that it pauses 5 seconds between "coin flips." If the user clicks the "Cancel", the coin-flipping loop terminates immediately.Flipper
Answer 1: See the source code for
. The modified program adds a delay in the central Flipper2
doInBackground
loop:
protected Object doInBackground() { long heads = 0; long total = 0; Random random = new Random(); while (!isCancelled()) { try { Thread.sleep(5000); } catch (InterruptedException e) { //Cancelled! return null; } total++; if (random.nextBoolean()) { heads++; } publish(new FlipPair(heads, total)); } return null; }
The try ... catch
causes doInBackground
to return if an interrupt is received while the thread is sleeping. Invoking cancel
with an argument of true
ensures that an interrupt is sent when the task is cancelled.