在上篇我们看到,A线程往公共资源库(对象)提供了一条数据,然后B线程从库中提取了数据并打印出来。

实际项目中,我们不可能只往库中提供一条数据,而且库的大小也不会是无穷大的,那么我们就会有这样一

个需求:A线程提供了一定的数据量后就暂停,等待B线程全部取走之后(因为B再不来取的话,库就装不下

了),A线程再往其中添加数据,如此往复。这里存在两种方法;

1.资源库对象的wait()方法和notify()方法/notifyAll()方法

 public class Share {
String name;
String sex;
//用empty来表示库中是否有数据
boolean empty = true; // 线程A的任务,提供数据
synchronized public void product(String name, String sex) {
try {
while(!empty) {
//当库中数据不为空时,A线程不能向其添加数据,小憩一会儿
this.wait();
}
//当库中数据为空时,A线程向其添加数据
this.name = name;
this.sex = sex;
//添加完成之后,更改库中数据状态为不空,并唤醒其他线程来拿数据
empty=false;
this.notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
} } // 线程B的任务,提取(显示)数据
synchronized public void show() {
try {
while(empty) {
//当库中数据为空时,B线程不能获取数据,小憩一会儿
this.wait();
}
//当库中数据不为空时,B线程获取数据并打印
System.out.println("姓名:" + this.name + "性别:" + this.sex);
//拿完数据之后,更改库中数据状态为空,并唤醒其他线程继续写数据
empty=true;
this.notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

wait()方法和notifyAll()方法只能由同步监听器对象来调用,就是这里说的资源库对象。

2.同步锁(Lock)和Condition接口

之前讲线程同步时有说到同步锁的方法,这种方法是没有同步监听器对象的,那么上面的wait()等方法就不能用了,

但是不用担心,java5在推出同步锁的时候也为其通信控制提供了一个方法获得Condition对象,来实现通信控制

 public class Share {
String name;
String sex;
//创建锁
final Lock lock = new ReentrantLock();
//创建Condition对象
Condition condition = lock.newCondition();
// 用empty来表示库中是否有数据
boolean empty = true; // 线程A的任务,提供数据
public void product(String name, String sex) {
lock.lock();//上锁
try {
while (!empty) {
// 当库中数据不为空时,A线程不能向其添加数据,小憩一会儿
condition.await();
}
// 当库中数据为空时,A线程向其添加数据
this.name = name;
this.sex = sex;
// 添加完成之后,更改库中数据状态为不空,并唤醒其他线程来拿数据
empty = false;
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();//解锁
} // 线程B的任务,提取(显示)数据
public void show() {
lock.lock();//上锁
try {
while (empty) {
// 当库中数据为空时,B线程不能获取数据,小憩一会儿
condition.await();
}
// 当库中数据不为空时,B线程获取数据并打印
System.out.println("姓名:" + this.name + "性别:" + this.sex);
// 拿完数据之后,更改库中数据状态为空,并唤醒其他线程继续写数据
empty = true;
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
condition.signalAll();//解锁
}
}

java线程之线程通信控制的更多相关文章

  1. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  2. java 多线程 4 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  3. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

  4. (转)java自带线程池和队列详细讲解 - CSDN过天的专栏

    一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util ...

  5. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  6. 小谈Java里的线程

    今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...

  7. Java 多线程 自定义线程辅助

    之前的文章我介绍了C#版本的多线程和自定义线程处理器. 接下来我们来看看Java版本的呢 java 的线程和C#的线程有点区别,java的线程没有是否是后台线程一说,具体原因是java的线程是jvm的 ...

  8. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  9. 【转】关于Java的Daemon线程的理解

    原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Dae ...

  10. 第24章 java线程(3)-线程的生命周期

    java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...

随机推荐

  1. iOS中 读取相册,调用系统相机 技术分享

    技术内容:分别读取相册以及调取相机,将图片显示到imageView上 布局: 1.创建imageView 和 button 并为button一个关联pickerImage的事件 <div sty ...

  2. 【闲谈】应聘时要问HR的7个问题

    前段时间朋友看了一本书,聊天中告诫了我关于毕业大学生面试时应该问HR的7个问题.这7个问题如下: 我所应聘的这个职位为什么会出现空缺 请问贵公司最成功的员工曾为公司作出了什么样的贡献 如何评估自己在试 ...

  3. 【shell脚本练习】判断用户存在和用户类型

    题目 写一个脚本 1. 传递一个参数给脚本,此参数为用户名: 2. 如果用户存在,则执行如下任务 * 如果用户的id号小于500,显示其为管理员或系统用户: * 否则,显示其为普通用户: 3. 如果用 ...

  4. 9、Libgdx的输入处理

    (官网:www.libgdx.cn) 不同的平台有着不同的输入方式.桌面用户可以通过键盘和鼠标与应用进行交互,基于浏览器的游戏也是这样.在Android中,鼠标被触摸屏所替代,通常没有实体键盘.And ...

  5. table中 点击某一行变色

    效果图: <html> <head> <meta http-equiv="Content-Type" content="text/html; ...

  6. 百度地图android studio导入开发插件

    百度地图SDK v3.5.0开发包下载地址:http://lbsyun.baidu.com/sdk/download?selected=location 开发工具 Android开发工具很多,在这我们 ...

  7. 求剁手的分享,如何简单开发js图表

    前段时间做的一个项目里需要用到js图表,在网上找了下,大概找到了highcharts.fusioncharts这些国外产品. 因为都收费,虽然有盗版,我也不敢用,万一被找上们来就砸锅卖铁了要.自己写j ...

  8. ssh命令大全

    常用格式:ssh [-l login_name] [-p port] [user@]hostname 更详细的可以用ssh -h查看. 举例 不指定用户: ssh 192.168.0.11 指定用户: ...

  9. PS 滤镜算法原理——高反差保留 (High Pass)

    这个特效简单来说,就是一个高通滤波器, 对图像做高斯滤波,用原图减去高斯滤波后的图,再将差值加上128. clc; clear all; close all; Image=imread('4.jpg' ...

  10. 未能加载文件或程序集“file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0

    未能加载文件或程序集"file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framewor ...