Я работаю над приложением и должен иметь возможность приостанавливать среднюю обработку основного потока. Моя идея состояла в том, чтобы иметь три потока: основные, поток прослушивания для ввода (либо остановить или GO команд), а затем другой поток, чтобы вызвать главное, чтобы остановить:Как я могу приостановить Главный поток из отдельного потока?
public static boolean stopped = false;
public static void main (String[] args){
Thread main = Thread.currentThread();
Runnable t1 = new Runnable() {
public void run() {
while(true){
Scanner s = new Scanner(System.in);
// wait for command
String in = s.nextLine();
if(in.equals("STOP")){
synchronized(main){
stopped = true;
//create new thread to make main wait
Runnable t2 = new Runnable() {
public void run(){
synchronized(main){
while(stopped){
main.wait();
}
}
}
};
Thread th2 = new Thread(t2);
th2.start();
}
}
if (in.equals("GO")){
synchronized(main){
stopped = false;
main.notifyAll();
}
}
}
}
};
Thread th1 = new Thread(t1);
th1.start();
while(true){
synchronized(main){
// Do lots of stuff that needs to pause when user enters STOP
System.out.println("Main is running");
Thread.sleep(5000);
}
}
}
}
В настоящее время основная продолжается через петлю, даже после остановки дается команда. Есть ли способ заблокировать главный, пока другой поток не освободит его, не делая в основном wait()
?
Использование 'notify' или 'notifyAll' - лучший подход здесь. Если вы хотите только уведомлять поток A из потока B, вам необходимо передать ссылку ('Thread.currentThread()'). –
Попробуйте прочитать Javadoc метода Object.wait(). Он не делает то, что вы думаете, но может быть частью решения. – meriton
Как насчет того, чтобы не пытаться заблокировать основной поток, а вместо этого использовать основной поток для прослушивания ввода? – Aify