2016-05-06 5 views
0

Я хочу, чтобы метод 2 спал до тех пор, пока метод 1 не разрешит повторному запуску метода 2. Как выполнить эту паузу?Как приостановить метод java

method 1{ 
some code here 
if(enter key pressed){ 
allow method 2 to continue 
} 
} 
method 2{ 
some code here 
wait until method 1 allow you to continue 
do whatever you are supposed to continue with 
} 
+0

Как эти методы взаимодействуют? Как вы создали потоки для этой задачи? – David

ответ

0

В любых методах языка должен быть точным и ONE-ЗАДАЧА ориентированных, если метод 2 начинает задачи, а затем ждет внешних вызовов продолжать, то это хороший знак корявого кода,

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

LIKE

method 1{ 
     some code here 
     method2_SubTaskA() 
     if(enter key pressed){ 
      allow method 2 to continue 
      method2_SubTaskB() 
     } 
} 
method 2SubTaskA{ 
     some code here 
     wait until method 1 allow you to continue 
     do whatever you are supposed to continue with 
} 
method 2SubTaskB{ 
     some code here 
     wait until method 1 allow you to continue 
     do whatever you are supposed to continue with 
} 
0

Вы можете использовать многопоточность для этого:

boolean method2Continue = false; 

public void method1() { 
    // ... 
    Thread thread = new Thread(() -> method2()); 
    thread.start(); 
    if(keyPressed){ 
     method2Continue = true; 
    } 
    thread.interrupt(); 
    // ... 
} 
public void method2() { 
    // ... 
    while(!method2Continue); 
    // ... 
} 

После thread.start() вызывается метод 1 и метод 2 будет выполняться одновременно, но когда метод 2 достигает время цикла , он будет ожидать, пока method2Continue будет истинным, пока он не перейдет к следующей строке. В конце метода 1 поток метода 2 будет прекращен, что прекратит его выполнение.

Смотрите демо здесь: https://ideone.com/eqnTh7

+0

Вы должны добавить ключевое слово 'volatile' в' method2Continue' –

+0

, это кажется хорошим, но я получаю красную строку в InterruptedException в try catch и сообщение «Ошибка синтаксиса, вставьте« VariableDeclaratorId »для завершения FormalParameter» – JavaProgrammer

+0

@ JavaProgrammer Проверьте обновленный код! – SamTebbs33

0

Использование нескольких потоков можно избежать здесь:

private Runnable runnable; 

void method1() { 
    // Some code here 
    if(enter key pressed && runnable != null) { 
     runnable.run(); // Execute continue code 
     runnable = null; // Make sure it can't be run twice 
    } 
} 

void method2() { 
    // Some code here 
    runnable = new Runnable(() -> { 
     // Continue code here 
    }); 
} 

Использования анонимного класса позволит вам захватить переменные из method2.

0

Как сказал @ SamTebbs33, используйте многопоточность; его пример является хорошей отправной точкой. Вместо использования boolean я рекомендую использовать CountdownLatch, чтобы указать, что пришло время для method2 для продолжения. Подробный пример приведен в следующем вопросе: How is CountDownLatch used in Java Multithreading?

В целом, использование встроенных API параллелизма безопаснее, чем создание собственного собственного решения - оно более понятно и менее подвержено ошибкам.

Посмотреть CoubtdownLatch JavaDocs в https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

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