今天看到一个问题,两个线程,轮流交替输出1,2,1,2。。。
看似很简单是吧,就是条件控制么,果断最简单的wait和notify,但是一致报IllegalMonitorStateException,各种囧啊,各种试。最后发现是obj.wait()和obj.notify()必须放在synchronized块内。。之前真的真的从来没注意过这个细节。。。
public class TestPrint {
public static void main(String[] args) throws Exception {
final Object obj = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
synchronized (obj) {
obj.notifyAll();
obj.wait();
System.out.println(1);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
synchronized (obj) {
obj.notifyAll();
obj.wait();
System.out.println(2);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t1.start();
t2.start();
};
}
线程优雅地中断也是一个需要注意的细节,interrupt、wait、join、sleep