До сих пор я знал, что ждать всегда нужно знать, что нужно работать должным образом. Но когда вы попробовали приведенный ниже код, я немного смущен о работе wait и notify.I создал три потока t1, t2, t3 и передал runnable T1, T2 и T3 соответственно. Согласно мне, когда я начал три потока, только t1 должен печатать, а t2 и t3 должны перейти в состояние ожидания и продолжать ждать, поскольку никто не уведомляет.Всегда ли нужно уведомлять о работе?
Но o/p непредсказуем для меня. Пусть кто-то, пожалуйста, предложите мне немного.
package com.vikash.Threading;
class T1 implements Runnable {
private State state;
public T1(State state) {
this.state=state;
}
@Override
public void run() {
synchronized (state) {
while(state.getState()!=1) {
try {
state.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (state) {
System.out.println(Thread.currentThread().getName());
state.setState(2);
}
}
}
}
class T2 implements Runnable {
private State state;
public T2(State state) {
this.state=state;
}
@Override
public void run() {
synchronized (state) {
while(state.getState()!=2) {
try {
state.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (state) {
System.out.println(Thread.currentThread().getName());
state.setState(3);
}
}
}
}
class T3 implements Runnable {
private State state;
public T3(State state) {
this.state=state;
}
@Override
public void run() {
synchronized (state) {
while(state.getState()!=3) {
try {
state.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (state) {
System.out.println(Thread.currentThread().getName());
state.setState(1);
}
}
}
}
public class Sequence {
public static void main(String[] args) {
State state=new State();
Thread t1=new Thread(new T1(state),"First");
Thread t2=new Thread(new T2(state),"Second");
Thread t3=new Thread(new T3(state),"Third");
t1.start();
t2.start();
t3.start();
}
}
package com.vikash.Threading;
public class State {
private int state=1;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
Согласно комментарий Я модифицируя мой question.The о/р, иногда я получаю первый второй и не прекращается, а иногда и первый второй третий и заканчиваются.
Пожалуйста, объясните * Но o/p непредсказуем для меня * –
Возможно, это не причина, но вы понимаете, что у вас есть вложенные «синхронизированные» см. Http://stackoverflow.com/a/10365261/2310289 –