线程之间的通信

有效解决线程之间的通信的两种手段:

1.wait()方法

2.notify()方法

如果一个正在执行同步代码(synchronized)的线程A执行wait()调用,则暂停执行并且排到一个等待的队列,同时释放已经获得的互斥锁。直到其他线程调用notify()或者notifyAll()方法,才能重新获得互斥锁。

notify()的作用就是用来唤醒正在等待互斥锁的第一个线程。

notifyAll()的作用是用来唤醒所有的在队列中的线程,并且具有最高优先级的线程获得互斥锁。

注意:wait()和notify()只能在同步代码块中调用。

            使线程阻塞的两种方法:sleep(),wait()。

sleep和wait的区别:

wait()放弃CPU资源的同时也交出了资源的控制权,而sleep()只交出了CPU资源。

代码演示:两个线程模拟存取票,要求没存入一张票,就售出一张票。知道售完为止

package practice4;

public class Tickets {
	protected int size;
	int number=0;
	boolean available=false;
	public Tickets(int size){
		this.size=size;
	}
	public synchronized void put(){
		//存票
		if(available){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("存入第【"+(++number)+"】号票");
		available=true;
		notify();//唤醒售票系统开始售票
	}
	public synchronized void sell(){
		//售票
		if(!available){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("售出第【"+number+"】号票");
		available=false;
		notify();//唤醒存票线程开始存票
		if(number==size) number=size+1;
	}
}

public class Producer extends Thread{
	Tickets t=null;
	public Producer(Tickets t){
		this.t=t;
	}
	public void run(){
		while(t.number<t.size)
			t.put();
	}
}
public class Consumer extends Thread{
	Tickets t=null;
	public Consumer(Tickets t){
		this.t=t;
	}
	public void run(){
		while(t.number<=t.size){
			t.sell();
		}
	}
}
public class App11_8 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Tickets t=new Tickets(10);
		new Producer(t).start();
		new Consumer(t).start();
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值