Java:同时运行多个while循环

时间:2013-09-18 09:52:51

标签: java multithreading swing while-loop thread-sleep

我试图用这种眨眼方法同时使几个JRadioButtons闪烁:

private void blink(JRadioButton button, boolean blinking)
{
    if(blinking)
    {
        while(true)
        {   
            try 
            {
                button.setSelected(true);
                Thread.sleep(500);
                button.setSelected(false);
                Thread.sleep(500);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
    else
    {
        button.setSelected(false);
    }
}

我知道它与线程有关但我对它们并不熟悉。

2 个答案:

答案 0 :(得分:3)

  

我试图用这种闪烁方法同时使几个JRadioButton闪烁

恕我直言,你不需要多个while循环。

只需将要闪烁的所有按钮添加到ArrayList,然后在同一个while循环中,循环显示该列表并闪烁按钮。所以,而不是

button.setSelected(true);
Thread.sleep(500);
button.setSelected(false);
Thread.sleep(500);

您可以使用

for(int i=0; i<yourList.size(); i++) {
    yourList.get(i).setSelected(true);
}
Thread.sleep(500);
for(int i=0; i<yourList.size(); i++) {
    yourList.get(i).setSelected(false);
}
Thread.sleep(500);

但这是一种不好的做法。使用Timer类并安排线程执行每500 ms:

Timer t = new Timer(500, new ActionListener() {
    boolean selected = false; 

    @Override
    public void actionPerformed(ActionEvent e) {
        selected = !selected;
        for(int i=0; i<yourList.size(); i++) {
            yourList.get(i).setSelected(selected);
        }
    }
});
t.start();

答案 1 :(得分:3)

您无法使用Thread.sleep为GUI设置动画。事实上,你必须永远不要在事件调度线程上调用Thread.sleep,因为那个线程负责重新绘制GUI,它在睡眠时显然无法做到。

你必须使用的是Swing Timer类,并安排它以所需的间隔重复。