Воспроизвести все возможные состояния потока java

Нужно написать приложение, которое выведет в консоль все возможные состояния потока в java, то есть вывод должен быть такой

 NEW
 RUNNABLE
 BLOCKED
 WAITING
 TIMED_WAITING
 TERMINATED

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

Поток, который умрёт через секунду.

public class SomeThread implements Runnable {
@Override
public void run() {
    System.out.println(Thread.currentThread().getState()+ " runnable");
    try {
        sleep(1000);
    } catch (Exception e){
        e.printStackTrace();
    }
}
}

Поток, который всегда в ожидании(я так и не смог его разбудить, пытался делать static переменную и применять notify из main, на что получал IllegalMonitorStateException)

public class SlowThread implements Runnable {
@Override
public void run() {
    try {
        Object a = new Object();
        synchronized (a) {
                a.wait();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Основной класс

public class StatesStart {
public static void main(String[] args) {
    try {
        Thread thread = new Thread(new SomeThread());
        Thread thread2 = new Thread(new SlowThread());
        System.out.println(thread.getState() + " new");
        thread.start();
        thread2.start();
        sleep(500);
        System.out.println(thread.getState() + " timed_waiting");
        System.out.println(thread2.getState() + " waiting");
        sleep(2000);
        System.out.println(thread.getState() + " terminated");

    }catch (Exception e){
        e.printStackTrace();
    }
}
}

Пока что удалось получить 5 состояний из 6, как можно получить BLOCKED?


Ответы (1 шт):

Автор решения: Surv

Благодаря Miron, я внёс нижеописанные изменения и получил все состояния потока в java

Тут добавил статический объект и написал к нему геттер

public class SlowThread implements Runnable {

public static Object getA() {
    return a;
}

private static Object a = new Object();
@Override
public void run() {
    try {

        synchronized (a) {
                a.wait();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

А в главный класс добавил synchronized блок, без него выкидывает исключение(как я понял из-за того, что мы не захватываем монитор(объект?) для работы и его могут перехватить) Тоже не очень почему, но монитор всё ещё заблокирован и следующая строчка выводит сообщение о том, что поток заблокирован. Впрочем, через 2 секунды узнаём, что поток всё-таки разбудили через notify и он благополучно завершился.

System.out.println(thread2.getState() + " waiting");

        Object a = SlowThread.getA();
        synchronized (a){
            a.notify();
        }

        System.out.println(thread2.getState() + " blocked");
        sleep(2000);
        System.out.println(thread2.getState() + " terminated thread 2");
→ Ссылка