public class CommunicationTest {
public static void main(String[] args) {
Number n1 = new Number();
n1.setName("线程1");
n1.start();
Number n2 = new Number();
n2.setName("线程2");
n2.start();
}
}
class Number extends Thread{
private static int i ;
@Override
public void run() {
for(;;) {
synchronized (Number.class) {
notify();
if(i <= 100) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + ":" + i);
i++;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
}
(1)静态变量 i 没有初始化啊。
private static int i =0;
(2)notify()和wait()的使用不对。
修改后运行结果:
Number类修改如下:
public class Number extends Thread{
private static int i =0;
@Override
public void run() {
for(;;) {
synchronized (Number.class) {
Number.class.notify();//注意这里加上加锁的对象
if(i <= 100) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + ":" + i);
i++;
try {
Number.class.wait();//注意这里加上加锁的对象
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
}
当某个线程获取到锁后,发现当前还不满足执行的条件,就可以调用对象锁的wait方法,进入等待状态。
只有已经获取锁的线程,才可以调用锁的wait、notify方法,否则会抛出异常IllegalMonitorStateException。