2014-01-14 252 views
1

所以我的问题是,我需要这些方法来运行一个又一个,但我不能解决如何使方法等待运行之前。 任何帮助表示赞赏。谢谢。 这里是我的代码:如何让Java在继续之前等待方法完成?

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(); 
+0

'thread.wait()':

更多相关信息,在给定? – sircapsalot

+0

很可能Thread.sleep(),我假设他想等待一段时间 – MWB

+3

不要在UI线程中睡觉或等待... – assylias

回答

1

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

+4

最好不要再使用'Thread.sleep()'。它已经很老了,并且已经有了更好的线程抽象层,比如'java.util.concurrent。*'。线程应该与控制器“签入”以确定流量。 – SnakeDoc

5

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

什么,你可能会寻找的是锁的概念:

一种方法,可以通过调用获取与对象相关的锁:

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

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

您还可以将synchronized语句添加到类的方法中,以使它们获取父对象的锁定。 http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+0

值得为您的解决方案做一些示范。只是想到这里来的人,可能正在等待一个更“强”的答案。 – ivanleoncz

相关问题