文档

Java™教程
教程路径: 使用Swing创建GUI
首页 > 使用Swing创建GUI

问题解答:Swing中的并发

问题

问题1:对于以下每个任务,指定应在哪个线程中执行以及为什么。
答案1:

问题2:没有任何任务首选的线程属于前面提到的问题。给这个线程命名并解释为什么它的应用非常有限。
答案2:初始线程在事件分派线程上启动第一个GUI任务。之后,Swing程序主要由GUI事件驱动,触发事件分派线程和工作线程上的任务。通常,初始线程没有其他任务可执行。

问题3:SwingWorker有两个类型参数。解释这些类型参数的使用方式,以及它们通常是什么并不重要。
答案3:类型参数指定最终结果的类型(也是doInBackground方法的返回类型)和中间结果的类型(也是publishprocess的参数类型)。许多后台任务不提供最终或中间结果。

练习

问题1:修改Flipper示例,使其在"翻转硬币"之间暂停5秒钟。如果用户点击"取消",则硬币翻转循环立即终止。
答案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确保在任务取消时发送中断。


上一页: 问题和练习:Swing中的并发