Java线程睡眠,但代码后不起作用?

时间:2012-12-03 05:07:30

标签: java multithreading sleep

我有一个尝试在Java中运行的线程,用于制作游戏。线程本质上会休眠一下,更新对象,然后调用repaint()。看起来它应该工作得很好,它看起来像我在互联网上找到的代码,但它不起作用。

代码在这里:

@Override
public void run() {
    int sleep = 500;
    Dimension dim = getSize();
    while(true){
        try {
            Thread.sleep(sleep);
            System.out.println("Sleeping!");
        } catch (InterruptedException e) {
            System.out.println("interrupted");
        }
        for(int i = 0 ; i < poop.size() ; i++){
            poop.get(i).update(dim.width, dim.height);
            System.out.println("Y is: "+poop.get(i).getYCoord()+" Step is: "+poop.get(i).getYStep());
        }
        repaint();
        }
}

当我将try catch块放入for循环,调用正常时,会发生问题,System.out也会打印Y坐标,但更新不再起作用。任何想法都会很棒。如果您需要更多代码,请告诉我,我也将更新代码放在这里。另外对待我就像初学者一样,我或多或少都是线程,也是初学者或多或少地使用摇摆库。

这是update()代码:

@Override public void update(int screenWidth, int screenHeight)
{
    xCoord += xStep;
    if (xCoord > screenWidth) {
        xCoord = 0;
    } else if (xCoord < 0) {
        xCoord = screenWidth;
    }

    yCoord += yStep;
    if (yCoord > screenHeight) {
        yCoord = 0;
    } else if (yCoord < 0) {
        yCoord = screenHeight;
    }
}

3 个答案:

答案 0 :(得分:0)

即使此代码位于run()方法中,并且可能位于Runnable对象中,但您的描述仍然是在Swing事件线程上调用Thread.sleep(...)的症状。如果这样做,则将整个GUI置于休眠状态,因为您正在睡眠的事件线程负责绘制GUI并与用户交互。

解决方案:不要那样做。执行任何长时间运行的任务或睡在后台线程中,例如在SwingWorker中。

或者,摆脱你的Thread.sleep(...)并改为使用Swing Timer。

答案 1 :(得分:0)

在for循环完成之前,你不会调用repaint()。所以坚持睡在里面不会导致它每500毫秒一次重绘一件事。这将导致它只需要size() * 500来完成循环,然后立即重新绘制所有内容。

答案 2 :(得分:0)

这里的问题是Dimension dim = getSize();由于某种原因将两者都设置为0。因此更新方法无法完成它的工作。