线程通讯方式
线程间通信常用方式如下:
1.Object的**wait**、**notify**、**notifyAll**
2.Condition的**await**、**signal**、**signalAll**
3.CountDownLatch:用于某个线程A等待若干个其他线程执行完之后,它才执行
4.CyclicBarrier:一组线程等待至某个状态之后再全部同时执行
5.Semaphore:用于控制对某组资源的访问权限
首先是休眠唤醒方式:
代码如下:public class OddEvenDemo {
private Object obj = new Object();
private Integer i = 0;
/**
* 奇数打印方法,由奇数线程调用
*/
public void odd(){
//1.判断i是否小于10,打印奇数
while (i<10){
synchronized (obj){
if(i%2 == 1){
System.out.println("奇数"+i);
i++;
obj.notify();//唤醒偶数线程打印
}else{
try {
obj.wait();//等待偶数线程打印
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 偶数打印方法,由偶数线程打印
*
*/
public void Even(){
while (i<10){
synchronized (obj){
if(i%2==0){
System.out.println("偶数"+i);
i++;
obj.notify();//唤醒偶数线程打印
}else{
try {
obj.wait();//等待偶数线程打印
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
final OddEvenDemo oddEvenDemo = new OddEvenDemo();
//1.开启奇数线程然后打印
Thread thread1 = new Thread(new Runnable() {
public void run() {
oddEvenDemo.odd();
}
});
//2.开启偶数线程
Thread thread2 = new Thread(new Runnable() {
public void run() {
oddEvenDemo.Even();
}
});
thread1.start();
thread2.start();
}
}
##运行结果如下:
这里是正确的结果.
##这里我犯了一个错误:因为没有将obj中的wait和notifty他们的使用是依赖synchronized关键字;
使用的时候必须要不wait和notifty放到synchronized的同步方法或者同步代码块中去.
所以我犯了这个错误.
总结:object wait()必须在synchronized(同步锁)下使用,
object wait()必须要通过Nodify()方法进行唤醒