线程的通信时在synchronized里实现的
Object类的wait()、notify() 、notifyAll()三个方法必须由同步监视器对象来调用,分两种情况:
a)同步方法,该类默认实例(this)就是同步监视器,可以在同步方法中可以直接调用
b)同步代码块,同步监视器是synchronized后括号里的对象,所以必须使用此对象调用这三个方法
wait() 与 notify() 和 notifyAll()
wait():令当前线程挂起并放弃CPU、同步资源。会释放锁。
notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
notifyAll ():唤醒正在排队等待资源的所有线程结束等待
Java.lang.Object提供的这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.IllegalMonitorStateException异常
使用两个线程打印 1-100. 线程1, 线程2 交替打印
package com.ghl.demo;
class Communication implements Runnable {
int i = 1;
public void run() {
while (true) {
synchronized (this) {
notify();//唤醒正在等待的线程
if (i <= 100) {
System.out.println(Thread.currentThread().getName() + ":" + i++);
} else
break;
try {
wait();//当前线程挂起 释放cpu资源 给下一个线程进行访问
} catch (InterruptedException e) {
}
}
}
}
}
public class PrinNum {
public static void main(String[] args) {
Communication co=new Communication();
Thread th=new Thread(co);
Thread th1=new Thread(co);
th.setName("甲方");
th1.setName("乙方");
th.start();
th1.start();
}
}
返回结果
甲方:1
乙方:2
甲方:3
乙方:4
甲方:5
乙方:6
甲方:7
乙方:8
甲方:9
乙方:10
甲方:11
乙方:12
甲方:13
乙方:14
甲方:15
乙方:16
甲方:17
乙方:18
甲方:19
乙方:20
甲方:21
乙方:22
甲方:23
乙方:24
甲方:25
乙方:26
甲方:27
乙方:28
甲方:29
乙方:30
甲方:31
乙方:32
甲方:33
乙方:34
甲方:35
乙方:36
甲方:37
乙方:38
甲方:39
乙方:40
甲方:41
乙方:42
甲方:43
乙方:44
甲方:45
乙方:46
甲方:47
乙方:48
甲方:49
乙方:50
甲方:51
乙方:52
甲方:53
乙方:54
甲方:55
乙方:56
甲方:57
乙方:58
甲方:59
乙方:60
甲方:61
乙方:62
甲方:63
乙方:64
甲方:65
乙方:66
甲方:67
乙方:68
甲方:69
乙方:70
甲方:71
乙方:72
甲方:73
乙方:74
甲方:75
乙方:76
甲方:77
乙方:78
甲方:79
乙方:80
甲方:81
乙方:82
甲方:83
乙方:84
甲方:85
乙方:86
甲方:87
乙方:88
甲方:89
乙方:90
甲方:91
乙方:92
甲方:93
乙方:94
甲方:95
乙方:96
甲方:97
乙方:98
甲方:99
乙方:100