Воспроизвести все возможные состояния потока 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 шт):
Благодаря 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");