如何让Java在继续之前等待方法完成?

4

我的问题是我需要这些方法按顺序运行,但我不知道如何使方法在运行之前等待。

任何帮助都受到赞赏。谢谢。

以下是我的代码:

public void startMoving() throws InterruptedException
{
    moveEnemy("right",3);
    wait();
    moveEnemy("down",3);
    wait();
    moveEnemy("right",2);
    wait();
    moveEnemy("up",1);
    wait();
    moveEnemy("right",2);
    wait();
    moveEnemy("up",2);
    wait();
    moveEnemy("right",2);
    wait();
    moveEnemy("down",4);
    wait();
    moveEnemy("left",1);
    wait();
    moveEnemy("down",2);
    wait();
    moveEnemy("right",3);
    wait();
    moveEnemy("up",2);
    wait();
    moveEnemy("right",1);
    wait();
    moveEnemy("up",1);
    wait();
    moveEnemy("right",3);
}
public void moveEnemy(final String direction, final int numMoves)
{
    Thread moveThread = new Thread(new Runnable()
    {
        public void run()
        {
            isMoving = true;
            int originalX = getX();
            int originalY = getY();
            for(int loop = 0; loop <= 98*numMoves; loop++)
            {
                try 
                {
                    Thread.sleep(5);
                } 
                catch (InterruptedException e){}
                if(direction.equals("up"))
                {
                    setLocation(originalX,originalY+loop);
                }
                if(direction.equals("down"))
                {
                    setLocation(originalX,originalY-loop);
                }
                if(direction.equals("left"))
                {
                    setLocation(originalX-loop,originalY);
                }
                if(direction.equals("right"))
                {
                    setLocation(originalX+loop,originalY);
                }
            }
            try 
            {
                Thread.sleep(50);
            } 
            catch (InterruptedException e){}
            notify();
        }
    });
    moveThread.start();

可能是 Thread.sleep(),我猜他想等待一段时间。 - MWB
3
不要在UI线程上睡眠或等待… - assylias
1
那就不要使用线程。 - Hauke Ingmar Schmidt
1
最好让您的单独线程在继续之前检查条件是否已满足。基本上,与您的控制器“签入”,看看它们是否应该继续或循环直到获得确认。我会避免在除测试/丢弃代码外的所有情况下使用Thread.sleep()Thread.sleep()存在各种问题,包括不精确。如果您需要精确触发方法,则可能值得检查ScheduledExecutorService和/或Quartz库。 - SnakeDoc
你为什么要使用 Thread 呢?你是想让操作在 EDT 之外但按顺序执行吗?那么你只需要一个 Thread,而不是现在每个操作都有一个。 - Hauke Ingmar Schmidt
你好!你已经解决了那个问题吗?我猜我面临着同样的问题。你有计时器吗?我假设你正在使用JFrame和JPanel,当计时器运行时重新绘制所有内容。我说得对吗? - Aidos
2个回答

9
最简单的解决方案可能是不使用线程,但我怀疑这不是你想要的。
你可能在寻找锁的概念:
可以通过调用以下方法来获取与对象关联的锁:
synchronized(nameOfTheLockObject) {
    //do some code here
}

这个方法获取给定对象的锁,执行代码后释放锁。如果锁已被其他方法/线程占用,则该代码会暂停,直到其他方法/线程释放锁。

您还可以将synchronized语句添加到类的方法中,以使它们获取父对象的锁。

更多信息,请参见: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html


值得展示一下你的解决方案。考虑到来这里的人,他们可能正在等待一个更“有力”的答案。 - ivanleoncz

2

您可以使用Thread.sleep(timeInMiliseconds)来暂停当前执行的线程。如果这是您用于更新UI的同一线程,那么在睡眠期间UI将被冻结,因此最好将所有UI内容放在其自己的线程上。


5
最好不要再使用Thread.sleep()了。它已经过时,现在有更好的线程抽象层,例如java.util.concurrent.*。线程应该通过与控制器进行“检查”来确定流程。 - SnakeDoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接