线程通讯方式-----休眠唤醒

线程通讯方式

	线程间通信常用方式如下:
				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()方法进行唤醒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值