Многопоточность: Как организовать замкнутый цикл ожидания события?
Как правильно организовать замкнутый цикл ожидания события не используя Thread.sleep?
public static void main(String[] args) {
GUI start = new GUI();
start.show();
Thread generalThread = go();
Thread thread = new Thread(new Runnable() {
public void run() {
synchronized(ObjRun) {
while (true) {
if (ObjRun.getRUN()) {
generalThread.start();
}
Thread.sleep(1000);
}
}
}
});
thread.start();
}
Ответы (1 шт):
Краткое описание: Существует два класса public class GUI extends JFrame и public class Main extends GUI. Стоит задача разделить логику программы от той части кода, которая отвечает за графический интерфейс наследуемый от JFrame. Для этого создаётся ещё один класс типа Singleton (например "Status").
public final class Status {
volatile private static boolean status;
public synchronized static boolean isRun() {
return status;
}
public synchronized static void setRun(boolean run) {
status = run;
}
public void stop() {
synchronized (this) {
try {
wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run() {
synchronized (this) {
notify();
}
}
}
Так как JFrame наследует интерфейс Runnable, следовательно, нужно создать "контроллер" типа Status который будет хранить в себе состояние программы, и синхронизировать его с элементами управления.
public class Main extends GUI {
public static final Status program;
static {
program = new Status();
}
public static void main(String[] args) {
GUI start = new GUI();
start.show();
Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
System.out.println("Thread 1");
if (Status.isRun()) {
logic().start();
}
//Thread sleep
program.stop();
}
}
});
thread.start();
}
private static Thread logic() {
Thread thread = new Thread(new Runnable() {
public void run() {
/***** some kind of logic *****/
System.out.println("Thread 2");
//Thread wakes up
program.run();
}
});
return thread;
}
В моём случае program.run() вызывается в классе "GUI", но может вызываться в любом месте программы, а для наглядности его вызов написан в отдельном потоке метода logic(). Таким образом в цикле while (true) мы ожидаем изменение volatile status в зависимости от logic()