2014-01-14 3 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

Не спите и не ждите в потоке пользовательского интерфейса ... – assylias

ответ

1

Вы можете использовать Thread.sleep(timeInMiliseconds), чтобы приостановить текущий выполняющийся поток. Если это тот же поток, который вы используете для обновления вашего пользовательского интерфейса, тогда пользовательский интерфейс будет заморожен во время сна, поэтому лучше всего хранить все материалы пользовательского интерфейса в своем потоке.

+4

Также лучше не использовать 'Thread.sleep()' больше. Он старый и имеет многослойный слой с гораздо лучшими потоками абстракции нитей, такими как 'java.util.concurrent. *'. Нитки должны «проверять» с контроллером для определения расхода. – SnakeDoc

5

Простейшим решением может быть не использование потоков, но я сомневаюсь, что это то, что вы хотите.

Что вы могли бы искать это понятие замков:

Способ может получить блокировку, связанную с объектом по телефону:

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

Это получает блокировку данного объекта, выполняет код и освобождает блокировку впоследствии. Если блокировка уже получена другим методом/потоком, код приостанавливается до тех пор, пока блокировка не будет освобождена другим методом/нитью.

Вы также можете добавить синхронизированный оператор к методам класса, чтобы заставить их получить блокировку родительского объекта.

Дополнительная информация об этом приведена на: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+0

Было бы полезно сделать некоторые демонстрации о вашем решении. Просто подумайте о людях, которые пришли сюда, и, вероятно, ожидали более «сильного» ответа. – ivanleoncz

Смежные вопросы