线程之间的通信

原创 2016年05月30日 22:34:50

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

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();
	}

}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Java线程之间的通信-等待/通知机制

线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能形成一个有效的整体,线程间的通讯就是称为一个整体的必用方案, 等待/通知机制的实现   方法wait()的作用是是当前执行代码...

线程之间的同步通信

我们都知道在java中线程的代码形式可以写为如下new Thread( new Runnable() { @Override public void run()...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

黑马程序员---传统线程之间的同步通信

---------------------- android培训、java培训、期待与您交流! ---------------------- 关于Tread之间进行同步通信 张孝祥老师举了...
  • Koccu
  • Koccu
  • 2012-07-08 08:58
  • 675

2016.6.22笔记(1)-线程之间的通信

线程之间的通信描述:存在两个线程,一个线程负责写入信息,另一个线程负责打印信息。 model类Student name sex (私有类) 线程:Input类,Output类。 启动两个线程分别执行打...

多线程之多窗口卖票&线程之间的通信

案例一:使用多线程完成三个窗口卖票(不能出现重复卖票以及负数票) 卖票程序SellTicket 这里使用Lock类中的方法实现加锁和释放锁! package cn.itcast.thread2; ...

java线程之间的通信(等待/通知机制)

线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照代码一步步的执行直到终止。但是,每个运行中的线程,如果仅仅是孤立地运行,那么没有太大的价值,但如果多个线程能够相互配合完成工作,这将会带来巨大的...
  • canot
  • canot
  • 2016-03-13 20:33
  • 1878
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)