线程间的通信 设置线程等待与线程唤醒

                                                  

代码实现上述框图:

  1 //等待唤醒机制
  2 
  3 /*
  4 wait(),notify(),notifyAll()必须用在同步中,因为同步中才有锁。
  5 指明让持有那个锁的线程去等待或被唤醒,例如object.wait(),表明让持有object这把锁的线程等待。
  6 
  7 wait():让线程进入等待状态,就是把线程放入了线程池。
  8 notify():唤醒线程池中的任意一个线程(持有特定锁的任意一个线程)。
  9 notifyAll():唤醒所有线程。
 10 
 11 wait(),notify(),notifyAll()为什么定义在Object中?
 12 锁可以是任意的对象,任意对象都可以调用的方法需要定义在Object中。
 13 */
 14 
 15 
 16 //描述数据
 17 class Resource 
 18 {
 19     public String name;
 20     public String gender;
 21     public boolean flag;             //添加标记,默认为false;标志位的用途:例如:Input存完一组数据可能继续持有CPU,存完后将flag置反,则Input无法继续存入数据。
 22     public Resource(){}
 23 }
 24 
 25 //描述输入任务
 26 class Input implements Runnable
 27 {
 28     private Resource res;
 29     public Input(Resource res)
 30     {
 31         this.res = res;
 32     }
 33     public void run()
 34     {
 35         int i = 1;
 36         while(true)
 37         {
 38             synchronized(res)       //加同步锁①
 39             {
 40                 if(res.flag)
 41                 {    
 42                     //等待的线程会放弃锁,跟sleep不同,sleep的线程仍然拥有锁。
 43                     try{res.wait();}catch(InterruptedException e){e.printStackTrace();}        //判断flag标志,先判断该不该存,如果为true,放弃CPU。
 44                 }
 45                 if(i==1)
 46                 {
 47                     res.name = "猪小明";
 48                     res.gender = "男";
 49                 }
 50                 else
 51                 {
 52                     res.name = "腿腿";
 53                     res.gender = "女";
 54                 }
 55                 i=(++i)%2;               //0、1切换
 56                 res.flag = true;
 57                 res.notify();            //唤醒对方,允许空唤醒。
 58                 //try{res.wait();}catch(InterruptedException e){e.printStackTrace();}
 59             }
 60         }
 61     }
 62 }
 63 
 64 //描述输出任务
 65 class Output implements Runnable
 66 {
 67     private Resource res;
 68     public Output(Resource res)
 69     {
 70         this.res = res;
 71     }
 72     public void run()
 73     {
 74         while(true)
 75         {    
 76             synchronized(res)      //加同步锁②,①处和此处为同一把锁!
 77             {
 78                 if(!res.flag)
 79                 {
 80                     try{res.wait();}catch(InterruptedException e){e.printStackTrace();}        //判断flag标志,先判断该不该存,如果为false,放弃CPU。
 81                 }
 82                 System.out.println(res.name + "....." + res.gender);
 83                 res.flag = false;
 84                 res.notify();          //唤醒对方
 85                 //try{res.wait();}catch(InterruptedException e){e.printStackTrace();}
 86             }
 87         }
 88     }
 89 }
 90 
 91 class TestDengdai
 92 {
 93     public static void main(String[] args)
 94     {
 95         //创建资源
 96         Resource res = new    Resource();
 97         //创建输入任务
 98         Input input = new Input(res);
 99         //创建输出任务
100         Output output = new Output(res);
101         //创建输入线程
102         Thread t1 = new Thread(input);
103         //创建输出线程
104         Thread t2 = new Thread(output);
105         //启动线程
106         t1.start();
107         t2.start();
108 
109     }
110 }

 

 

 

 

上述代码实现存入一个输出一个的运行效果:

转载于:https://www.cnblogs.com/tzc1024/p/6040700.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos6.8升级python3.5.2

1.查看系统python版本 [rootmyserver01 Python-3.5.2]# python -V Python 2.6.6 2.升级3.5.2 A.下载:wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 或者在浏览器下载(选择Linux/UNIX平台,选择3.5.2版本) B.编译…

gwt的mvp模式_GWT MVP变得简单

gwt的mvp模式GWT Model-View-Presenter是用于大规模应用程序开发的设计模式。 它源于MVC,它在视图和逻辑之间进行划分,并有助于创建结构良好,易于测试的代码。 为了帮助像我这样的懒惰开发人员,我研究了如何减少使用声明式UI时要编…

简记用ArcGIS处理某项目需求中数据的步骤

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤: a.矢量化 b.获取范围内要素 c.合并要素 d.简化要素 e.获取范围外要素。 2. 矢量化 新建图层 开启编辑&am…

企业应用程序集成简介

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适…

win7 网络端口怎么设置_教你win7如何设置网络共享文件夹

网络共享是以PC机为载体的信息资源共享。如果我们想让其他人共享我们的文件夹,我们需要进行一些设置。今天,我将分享在win7系统中设置网络共享文件夹的方法现在大多数家庭都使用win7系统,它简化了很多设计,使用起来也很方便。它不…

vue 字符串分割_嗯哼vue组件taginput包教不包会

5分钟实现一个Tag-Input(标签)组件前言本文是wo写组件设计的第一篇文章(处女作),之所以会写组件设计相关的文章,是因为作为一名优秀的前端工程师,面对各种繁琐而重复的工作,我们不应该按部就班的去辛(dao)勤(gen)劳(huo)动(zhong)&#xff0c…

SpringBoot项目部署与服务配置

spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。当然你也可以将项目打包成war包,放到独立的web容器中&a…

向导页设计_向导设计模式

向导页设计我们都喜欢巫师……。 (我的意思是软件向导)。 我们总是很高兴跳到那些“下一步”按钮上,就像我们在我们的时髦的小鸡上跳舞一样。。。 因此,今天我们将您心爱的向导带入您的编码体验。 让我们跳入一个例子。 假设您要设…

微信小程序需要https后台的创业机会思考

最近比较关注微信小程序,而且微信小程序的后台必须强制要求https, https相对http成本要高很多了。 这里我感觉有2个商机 (1)提供https 中转服务器 ,按流量来收费 (2) 微信小程序https 云后台 对于很多人学…

aspx是什么语言_什么是网页

第一个问题,什么是网页?我们通常在网上浏览的所有网页都是网页,一个网站由一页到50页不等的网页组成,一些大型网站可能包含数千万页,是第一个打开网站的网站。这些页面被称为主页。专有名词:这里简要介绍网页、网站和主…

mysql运算结果放入表中_MySQL表1新增数据,计算开始、结束日期之间所有时间,插入到表2中...

新建表c3#id设置自增量,kk是要同步的一些数据值,dd是开始时间,dde是结束时间CREATE TABLE c3 (id int(11) NOT NULL auto_increment PRIMARY KEY,kk varchar(255),dd datetime,dde datetime)新建表c4#id也设置自增量,kk是要同步…

longtext长度为0是什么意思_为什么 HashMap 中链表长度大于 8 才转化为红黑树?

Java 中的 HashMap 采用链表法来解决哈希冲突(HashMap 原理),即具有相同桶下标的键值对使用一个链表储存。当链表变长时,查找和添加(需要确定 key 是否已经存在)都需要遍历这个链表,速度会变慢。…

python图形界面教程_图形教程

python图形界面教程众所周知,我们可以借助Java库制作游戏,这些库为我们提供制作游戏所需的图形。 因此,今天我将开始一个关于Java图形的非常新的部分。 我之前曾发表过有关如何制作所得税计算器的文章 。 首先要满足一些先决条件:…

java创建树结构_Java学习之XML-017

如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。反复练习直到熟练。————百战程序员1.0 XML1.1 XML 简介XML 指可扩展标记语言。XML 被设计用来传输和存储数据。1. 什么是XMLXML 指可扩展标记语言(EXten…

WebDriver API元素的定位

一、以下截图为用FireBug定位的用火狐(Firefox)浏览器打开的百度首页,下面所讲述的八种定位方法,就是以该截图中的百度输入框为例子。 ①、FireBug是Firefox浏览器下的开发类插件,通过该插件可以查看HTML、CSS、Javascript控制台、网络状况监…

findbugs-dea_FindBugs和JSR-305

findbugs-dea假设该组开发人员在大型项目的各个部分上并行工作-一些开发人员在进行服务实现,而其他开发人员在使用该服务的代码。 考虑到API的假设,两个小组都同意服务API,并开始单独工作。 您认为这个故事会有幸福的结局吗? 好吧…

带有ActiveMQ和Maven的JMS Sender应用程序

我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www…

mysql aes密钥大于16位_aes秘钥限制问题解决办法

在oarcle jdk1.8上执行256位的aes秘钥加密报错如下:java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key sizeat com.xx.opal.core.utils.aes.AESTool.encryptWithoutEncode(AESTool.java:33)at com.xx.opal.aes.AESTest.test(AESTest.java:19)at sun…

background-clip与background-origin

规定背景的绘制区域 浏览器支持 IE9、Firefox、Opera、Chrome 以及 Safari 支持 background-clip 属性。 注释&#xff1a;Internet Explorer 8 以及更早的版本不支持 background-clip 属性。IE9、Firefox、Opera、Chrome 以及 Safari 支持 background-clip 属性。 有三个值&am…

策略模式应用场景和uml_策略模式

策略模式应用场景和uml在最近的博客中&#xff0c;我收到了Wojciech Soczy&#xff1f;ski的评论&#xff0c;内容涉及在使用“不要问”&#xff08;TDA&#xff09;时如何使用“战略”模式实施单一责任原则&#xff08;SRP&#xff09;。 在某些时候&#xff0c;我打算进一步讨…