Thread.sleep在前一代码之前激活

时间:2014-07-10 13:09:14

标签: multithreading threadpool

此代码将检查一行中的三个按钮是否具有相同的文本。如果是这样,它会在这些按钮上将颜色更改为绿色,并将int counter更改为9.当它超过这段代码时,它会将所有按钮重置为原始状态,因为counter == 9.

问题是,它会在按钮变绿之前进入睡眠状态。那是为什么?

int counter = 0;

private void winCheck(String sign)
{
    if (jButton1.getText().equals(sign))
    {
        if (jButton2.getText().equals(sign))
        {
            if (jButton3.getText().equals(sign))
            {
                jButton1.setBackground(Color.GREEN);
                jButton2.setBackground(Color.GREEN);
                jButton3.setBackground(Color.GREEN);
                counter = 9;   
            }

            try {
                    Thread.sleep(1000);
                } 
            catch(InterruptedException ex) 
                {
                    Thread.currentThread().interrupt();
                }
        }
}

// This last part to show what I mean with reset.
counter++;

    if (counter == 10)
    {
        jButton1.setBackground(null);
        jButton1.setText(" ");

        counter = 0;
    }

1 个答案:

答案 0 :(得分:1)

Kirill Shlenskiy的回答(请提出他的意见):

问题是,它会在按钮变绿之前进入睡眠状态。 - 这不太可能是真的。单步执行代码 - 我敢打赌,按钮背景颜色值将与您在设置它之后(以及在点击Thread.sleep之前)正好相同。您无法看到更新,因为您的UI线程忙于等待阻塞的Thread.sleep调用完成而不是抽取。您需要一个异步替代睡眠(例如计时器)或强制UI元素立即重绘的方法。 - Kirill Shlenskiy 7月10日13:38

我将颜色设置为绿色但是在我让线程进入睡眠状态之前没有绘制颜色? - uranibaba 7月11日8:10

@uranibaba,对。这是设计的。 UI线程在没有其他任何操作时重绘UI。 Thread.sleep不会推迟方法的其余部分 - 它会阻塞线程,以便它可以执行任何其他操作(即重绘UI),直到同步工作完成。 - Kirill Shlenskiy 7月11日10:43