我是否纠正了为什么一件事有效以及为什么我以前所做的事情不起作用? (关于线程)

时间:2011-12-11 01:23:39

标签: java multithreading actionlistener

我正在尝试使此按钮禁用其他两个按钮并同时执行图形化操作。这是我尝试的第一件事:

public void actionPerformed(ActionEvent arg0) {
    reset.setEnabled(false);
    switcher.setEnabled(false);
    for (int i = 0; i < 10; i++){
            a.change();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            return;
        }
    }
}

所以这是按钮上的actionperformed方法我正在尝试编码,切换器和重置是我禁用的按钮,a.change()应该会产生视觉效果。当我尝试这个时,整个程序停止了十秒钟,然后按钮被禁用,在这十秒钟内没有视觉效果。然后我试了一下:

public void actionPerformed(ActionEvent arg0) {
    reset.setEnabled(false);
    switcher.setEnabled(false);

    if (!s.isAlive()){
        s = new Thread(new Changer());
        s.start();
    }
    else{
        s.interrupt();
    }
}

Changer是:

private static class Changer implements Runnable {
    public void run() {
        for (int i = 0; i < 10; i++){
            a.change();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            }
        }
    }
}

这正是我想要的,按钮立即被禁用,然后是视觉效果。这样做的原因是actionper的所有效果都会在退出函数时激活,所以第一种方式,actionperformed结束将持续10秒,并且它会同时执行两次禁用和十次a.change()s ?第二种方式是在启动s之后解析,所以按钮禁用,然后s继续并在actionperformed结束后发挥作用?

2 个答案:

答案 0 :(得分:6)

有一个UI线程管理事件和重新绘制(更新屏幕)。在你的第一次尝试中,你让它入睡。这样做意味着在它醒来之前不会发生任何其他事情(关于UI)。

答案 1 :(得分:1)

是。你是对的。这就是原因。