线程之间的通信

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

}


多个线程之间是如何进行通信的呢?

在现实应用中,很多时候都需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题。这类问题描述了这样一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库...
  • u011461231
  • u011461231
  • 2016年10月16日 10:06
  • 3542

线程间的通信、同步方式与进程间通信方式

线程间的通信、同步方式与进程间通信方式 字数1771 阅读3355 评论0 喜欢6 1、线程间的通信方式 使用全局变量 主要由于多个线程可能更改全局变量,因此全局变量最好声明为...
  • liu5320102
  • liu5320102
  • 2016年02月29日 12:33
  • 1199

java多线程与线程间通信

本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程的众多常见重要知识点,学习后会对java多线程概念及线程间通信方式有直观清晰的了解和掌握,可以编写并分析简单的多线程程序。 ...
  • jerrying0203
  • jerrying0203
  • 2015年05月07日 17:23
  • 8662

多线程之间的线程通信

  • 2012年07月21日 12:16
  • 4KB
  • 下载

Android两个子线程之间的通信

  • 2015年03月20日 17:21
  • 1.41MB
  • 下载

android线程之间通信原理

  • 2016年05月18日 16:17
  • 3KB
  • 下载

VC中利用多线程技术实现线程之间的通信

  • 2010年12月01日 23:56
  • 266KB
  • 下载

GUI(主)线程与子线程之间的通信

在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。 程序截图: 上代码: #in...
  • AAA20090987
  • AAA20090987
  • 2011年08月12日 14:59
  • 9036

Python 进程线程之间通信方式(1,基于队列的)

1.Python队列的基本示例 #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:xp #blog_url: http://blog...
  • wuxingpu5
  • wuxingpu5
  • 2017年06月30日 16:51
  • 181

Android中Activity、Service和线程之间的通信

 (2011-09-17 10:14:33) 转载▼ 标签: android activity service 线程 之间 通信 it 分...
  • yuanyuan_186
  • yuanyuan_186
  • 2014年04月02日 18:53
  • 359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程之间的通信
举报原因:
原因补充:

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