【问题标题】:How do I make Java wait for a method to finish before continuing?如何让 Java 在继续之前等待方法完成?
【发布时间】:2014-01-14 21:58:47
【问题描述】:

所以我的问题是我需要这些方法一个接一个地运行,但我不知道如何让这些方法在运行前等待。 任何帮助表示赞赏。谢谢你。 这是我的代码:

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(),我假设他想等待一段时间
  • 不要在 UI 线程上休眠或等待...
  • 那么不要使用线程。
  • 在继续之前,最好先满足您的单独线程检查条件。基本上与您的控制器“签入”,看看他们是否应该继续或循环直到确定。除了测试/丢弃代码之外,我会避免使用Thread.sleep()Thread.sleep() 有各种问题,包括不精确。如果您需要精确触发方法,可能值得查看ScheduledExecutorService 和/或Quartz 库。
  • 你为什么要使用Threads?您是否要按顺序将操作排除在 EDT 之外?那么你需要一个 Thread,而不是像现在这样每个操作一个。

标签: java methods jframe jbutton wait


【解决方案1】:

最简单的解决方案可能是不使用线程,但我怀疑这就是你想要的。

您可能正在寻找的是锁的概念:

方法可以通过调用获取与对象关联的锁:

synchronized(nameOfTheLockObject) {
    //do some code here
}

这会获取给定对象的锁,然后执行代码并释放锁。如果锁已经被另一个方法/线程获取,代码会暂停,直到锁被另一个方法/线程释放。

您也可以在类的方法中添加同步语句,使它们获得父对象的锁。

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

【讨论】:

  • 值得对您的解决方案进行一些演示。想想那些来到这里的人,可能正在等待更“有力”的答案。
【解决方案2】:

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

【讨论】:

  • 最好不要再使用Thread.sleep()。它很旧,并且已经被更好的线程抽象层覆盖,例如java.util.concurrent.*。线程应该与控制器“签入”以确定流程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多