Как ждать поток в контексте Stati c? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь дождаться потока в состоянии c до тех пор, пока он не выполнит условие в Java.

Насколько я понимаю, Object.wait() заставляет текущий поток ждать, пока другой поток уведомляет объект о том, что он находится в состоянии ожидания.

Поэтому я попытался применить тот же механизм к методу stati c, но поскольку контекст имеет статус stati c, wait() вызовет текущий поток ожидать класса, и notify() уведомит сам класс, а не объект.

Однако в контексте c текущий объект не определен. Так как я могу даже вызвать метод wait()?

public static synchronized void waitThread() {
    //how can I call the current thread to wait in a static method?
    //wait();
}

1 Ответ

1 голос
/ 29 марта 2020

wait () - это метод Object, а не метод Thread. Я предлагаю вам использовать объект блокировки stati c, как в этом примере:

public class ThreadTest {

Thread1 t1;
Thread2 t2;
static Object lock = new Object();

public static void main(String[] args) {
    new ThreadTest().go();
}

private void go() {

    t1 = new Thread1();
    t2 = new Thread2();
    t1.start();
    t2.start();
}

private class Thread1 extends Thread {
    @Override
    public void run() {
        ThreadTest.print("ONE");
        synchronized (lock) {
            lock.notify();
        }
    }
}

private class Thread2 extends Thread {
    @Override
    public void run() {
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
        }
        synchronized (lock) {
            lock.notify();
        }
        ThreadTest.print("two");
    }
}

private static void print(String str) {
    synchronized (lock) {
        try {
            lock.wait();
        } catch (InterruptedException e) {
        }
    }

    for (int i = 0; i < str.length(); i++) {
        System.out.print(str.charAt(i));
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
        }
    }
}

}

Благодаря вызовам wait () и notify () распечатки выглядят хорошо. Без них распечатки будут перепутаны.

Также обратите внимание на CountDownLatch, который был бы более изощренным способом согласования потоков.

...