Java多线程学习(七)

两个线程间通信

1.什么时候需要通信

多线程并发执行时,在默认情况下CPU是随机切换线程,如果我们希望他们有规律执行,需要使用通信

2.怎么通信

希望线程等待用wait()

唤醒等待的线程用notify()

这两个方法必须在同步代码块中执行,且使用对象锁来调用

package javastudy01;

public class notify {

	public static void main(String[] args) {
		 printer3  p = new printer3();
		new Thread(){
			public void run(){
				 while(true){
					 try {
						p.printer1();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				 }
			}
		
		}.start();
		
		new Thread(){
			public void run(){
				 while(true){
					 try {
						p.printer2();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				 }
			}
		
		}.start();

	}

}
//等待唤醒机制,实现交替输出
 class printer3 {
	private int flag =1;
	public void printer1() throws InterruptedException{
		synchronized(this){  
		if(flag!=1){
			this.wait();
		}	
		System.out.print("我");
		System.out.print("是");
		System.out.print("胡");
		System.out.print("博");
		System.out.print("士\n");
		flag =2;
		this.notify();
		}
	}
	 
	public void printer2() throws InterruptedException{
		synchronized(this){
			if(flag!=2){
				this.wait();  //当前线程等待
			}	
		System.out.print("同");
		System.out.print("步");
		System.out.print("代");
		System.out.print("码");
		System.out.print("块\n");
		flag =1;
		this.notify();  //随机唤醒单个等待的线程
		}
	}
}

运行结果

 3.一些注意事项

1 在同步代码块中,用哪个对象锁,就用哪个对象锁来调用wait方法

2 为什么wait和notify这些方法定义在object类中

锁对象可以是任意对象,那么任意对象对应的类都是object的子类,object是所有类基类

所有定义在object中,可以让任意对象对其进行调用

3 sleep与wait区别

sleep在同步代码块或同步函数中,在睡眠时不释放锁,而wait释放锁

sleep方法必须传入时间参数,但wait不用传入

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值