黑马程序员_多线程间通信的两种方式_黑马 线程间通信代码_c水滴石穿的博客-程序员秘密

技术标签: 线程间通信  多线程通信方式  

------- android培训java培训、期待与您交流!----------
线程间通信:其实就是多个线程操作同一个资源,但是操作的动作不同。
通过一个需求来演示两种通信方式: 有一个共享资源类Resource,有一个生产者,一个消费者,每生产一个就消费一个。
第一种:
class Resource{//这是一个共享资源类。
	private String name;
	private int count=1;
	private boolean flag = false;//定义一个判断标记
	public synchronized void set(String name){
		while(flag){//是用while的原因:被唤醒的线程在判断一次标记。if只判断一次。
			try {
				this.wait();//flag为true的时候,就等待。
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		this.name=name+"--"+count++;
		System.out.println(Thread.currentThread().getName()+"....生成者.."+this.name);
		flag = true;//将flag设置为true
		this.notifyAll();//唤醒等待的所有线程。notify()只能唤醒一个线程,可能导致程序中的所有线程都等待。
	}
	public synchronized void get(){
		while(!flag){//当flag 等于false的时候,就等待。
			try {
				this.wait();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println(Thread.currentThread().getName()+"....消费者........."+this.name);;
		flag = false;//将flag设置为false
		this.notifyAll();//唤醒所有等待的线程。
	}
}

class Producer implements Runnable{//创建一个生产者的线程。
	private Resource r ;
	public Producer(Resource r) {
		this.r = r;
	}
	public void run(){
		while(true){
			r.set("+商品+");
		}
	}
}

class Consumer implements Runnable{//创建一个消费者的线程。
	private Resource r ;
	Consumer(Resource r){
		this.r = r;
	}
	public void run(){
		while(true){
			r.get();
		}
	}
}

public class Demo19 {

	public static void main(String[] args) {
		 Resource r = new Resource();
		 Producer p = new Producer(r);
		 Consumer c = new Consumer(r);
		 new Thread(p).start();
		 new Thread(c).start();
		 new Thread(p).start();
		 new Thread(c).start();
	}

}

第二种方式:在JDK1.5提供了多线程的升级解决方案,将synchronized替换成了显示的Lock操作;将Object中的wait,notify, notifyAll替换成了Condition对象的await,signal,signalAll,该对象可以通过Lock获取。通过该方法可以实现本方只唤醒对方的 操作。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


class Resource1{
	private String name;
	private int count=1;
	boolean flag = false;
	private Lock lock = new ReentrantLock();//创建一个锁
	private Condition condition_pro = lock.newCondition();//创建一个生产者的Condition对象。Object类的替代类。
	private Condition condition_con = lock.newCondition();//创建一个消费者的Condition对象。
	public void set(String name)throws InterruptedException{
		lock.lock();//上锁
		try{
			while(flag){
				condition_pro.await();//如果flag为true,生产者线程就等待。
			}
			this.name = name+"--"+count++;
			System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
			flag = true;
			condition_con.signal();//唤醒消费者线程。
		}finally{
			lock.unlock();//解锁
		}
	}
	
	public void get()throws InterruptedException{
		lock.lock();//上锁
		try{
			while(!flag){
				condition_con.await();//如果flag为flase,消费者线程就等待
			}
			System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
			flag = false;
			condition_pro.signal();//唤醒生产者线程。
			
		}finally{
			lock.unlock();//解锁
		}
	}
}

class Producer1 implements Runnable{
	private Resource1 r ;
	public Producer1(Resource1 r) {
		this.r = r;
	}
	public void run(){
		while(true){
			try {
				r.set("+商品+");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Consumer1 implements Runnable{
	private Resource1 r;
	Consumer1(Resource1 r){
		this.r = r;
	}
	public void run(){
		while(true){
			try {
				r.get();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}


public class Demo20 {
	public static void main(String[] args) {
		Resource1 r = new Resource1();
		new Thread(new Producer1(r)).start();
		new Thread(new Consumer1(r)).start();
		new Thread(new Producer1(r)).start();
		new Thread(new Consumer1(r)).start();
	}

}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sdsccyy/article/details/8744769

智能推荐

websocket实战_雨风hha的博客-程序员秘密

前言互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他;也正是这种依赖,促进了互联网技术的飞速发展。而终端设备的创新与发展,更加速了互联网的进化;HTTP/1.1规范发布于1999年,同年12月24日,HTML4.01规范发布;尽管已到2012年,但HTML4.01仍是主流;虽然HTML5的草案已出现了好几个年头,但转正日期,遥遥无期,少则三五年,多则数十年;而HTML

走进青年程序员:“码农”过了35岁还有价值吗?_马丁的早晨n的博客-程序员秘密

穿格子衬衫、戴黑框眼镜,平日里不善言辞,只顾坐在电脑屏幕前“无情”地敲击键盘,偶尔还会对自己日渐稀疏的头发发出几声叹息——这是如今社交媒体上众多网友对程序员这个群体的刻板印象。对此,程序员...

[ESP32/ESP8266专题笔记-4] ESP32开发板-Micropython-TCP 远程通信_esp32延时函数_小树笔记的博客-程序员秘密

ESP32开发板-Micropython-TCP 远程通信控制LED操作1 硬件篇,确定连接LED的GPIO口2 软件篇(1)ESP32能控制灯亮灭from machine import Pin # 导入Pin模块from utime import sleep_ms #导入延时函数def led(control_cmd): LED = Pin(22,Pin.OUT) # 构建 LED 对象,GPIO22 输出 if control_cmd == "灯亮":

《C程序员从校园到职场》第3章 程序的样式_人民邮电出版社有限公司的博客-程序员秘密

第3章 程序的样式 在《高质量程序设计指南(C++/C语言)》中,作者说:可以把程序的版式比喻为“书法”,好的“书法”可以让人对程序一目了然,看得兴致勃勃。确实,我们一打开程序,首先看到的便是程序的排版,我们的第一印象便是程序写得是工整还是凌乱。都说第一印象很重要,为了给大家留下好的第一印象,我们一定要注重程序的版式。 此外,好的注释能够帮助读者更快地理解程序,提高工作效率。也许是因为工作比较...

javaweb敏感词过滤_dillon_no1的博客-程序员秘密

javaweb敏感词过滤1.装饰模式2.代理模式真实对象代理对象代理模式实现方式:1.静态代理:有一个类文件描述代理模式2.动态代理:在内存中形成代理类实现步骤:代理对象与真实对象实现相同的接口代理对象 = Proxy.newInstance使用代理对象调用方法。增强方法增强方式:1.增强参数列表2.增强返回值类型3.增强方法体执行逻辑...

Spring Boot——自定义多个拦截器(HandlerInterceptor)配置方法与执行顺序_spring handlerinterceptor 多个实现_Starzkg的博客-程序员秘密

执行顺序源代码拦截器类package com.jd.m.tg.interceptor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.serv...

随便推点

werkzeug.routing.BuildError_snow哈哈哈哈的博客-程序员秘密

werkzeug.routing.BuildErrorBuildError: Could not build url for endpoint 'auth.login'. Did you mean 'upload_file' instead?解决方法:在int.py文件中加入路由指引from auth import auth as auth_blueprint ...

高防CDN、高防服务器以及高防IP怎么选择_高防cdn加高防服务器_数据湾的博客-程序员秘密

目前市面上抵御DDOS攻击的机器主要有这三种,分别是高防CDN和高防服务器以及高防IP这三种主流防御机器。这三者之间有什么区别?站长们又该如何选择自己的防御机器呢?高防CDN、高防服务器以及高防IP之间的区别1、在三者之中,高防IP是最方便的,可以做到即买即用,高防IP适用于应用方面的防护,如游戏业务,各种应用业务系统等。2、高防CDN的特点是多节点防御,还自带访问加速功能,适合WEB网站使用,尤其是对网站加速和DDoS防御要求不太高的用户,如大型门户网站(比如商城,...

数据控件数据绑定方法_weixin_30814223的博客-程序员秘密

Datalist ,gridview,repeater 数据绑定方法 12SqlConnectioncon=newSqlConnection();3con.ConnectionString="server=(local);database=YourDataBase;Trusted_Connection=yes";4con.Open();5Sql...

计算机技术与软件专业以考代评政策之我见_apple199203的博客-程序员秘密

作为一名计算机从业人员,能否获得政府认可的计算机类职称也是绝大多数IT人关心的问题,对于计算机技术与软件专业国家从2004年开始在初级、中级、高级执行“以考代评”的政策,通过参加计算机技术与软件专业技术资格(水平)考试(以下简称软考)取得,具体政策根据人事部、信息产业部文件(国人部发[2003]39号),计算机软件考试纳入全国专业技术人员职业资格证书制度的统一规划。通过考试获得证...

Python生成随机字符串SECRET_KEY_guohewei123的博客-程序员秘密

# -*- coding=utf8 -*-import osimport base64import randomimport timeimport hashlib# 方法一tmp = os.urandom(44)secret_key = base64.b64encode(tmp)print(secret_key)# 方法二def get_random_secret_ke...

Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)_辉辉308的博客-程序员秘密

本文作为SPI的第二篇文章,讲述了设备驱动模型等。包括:1、spi总线注册。2、spi驱动注册。3、spi设备注册。4、spi传输函数。

推荐文章

热门文章

相关标签