java线程之线程通信控制
在上篇我们看到,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线程之线程通信控制的更多相关文章
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 4 线程池
系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...
- Java并发1——线程创建、启动、生命周期与线程控制
内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...
- (转)java自带线程池和队列详细讲解 - CSDN过天的专栏
一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util ...
- 线程和线程池的理解与java简单例子
1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
- Java 多线程 自定义线程辅助
之前的文章我介绍了C#版本的多线程和自定义线程处理器. 接下来我们来看看Java版本的呢 java 的线程和C#的线程有点区别,java的线程没有是否是后台线程一说,具体原因是java的线程是jvm的 ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- 【转】关于Java的Daemon线程的理解
原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Dae ...
- 第24章 java线程(3)-线程的生命周期
java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...
随机推荐
- javascript之prototype原型属性案例
练习: 给字符串对象添加一个toCharArray的方法,然后再添加一个reverse(翻转)的 方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- OC语言大总结(上)
根据OC学习的知识点,总结了一下,希望能帮到大家! 作者:韩俊强 未经允许,请勿转载! 关注博主:http://weibo.com/hanjunqiang 第一节类于对象 类与对象http:// ...
- C++ Primer 有感(顺序容器)
1.顺序容器的元素排列次序与元素的值无关,而是由元素添加到容器里的次序决定. 2. 顺序容器 vector 支持快速随机访问 list ...
- Chipmunk碰撞形状:cpShape
目前有3种碰撞类型: 圆(Circles):最快并且最简单的碰撞形状 线段(Line segment):主要用于静态形状.可以表示斜线(Can be beveled in order to give ...
- Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局
Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...
- hive语句嵌入python脚本(进行map和reduce,实现左外连接)
在Hive语句中使用脚本(如python和shell)进行map和reduce:利用命令transform(或者指定map和reduce),配合加入的脚本文件add file 请看:http://ww ...
- 集群通信组件tribes之集群的消息接收通道
与消息发送通道对应,发送的消息需要一个接收端接收消息,它就是ChannelReceiver.接收端负责接收处理其他节点从消息发送通道发送过来的消息,实际情况如图每个节点都有一个ChannelSende ...
- 用jquery+Asp.Net实现省市二级联动
页面html: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ddlAjax. ...
- kettel的stream lookup报错
kettel的stream lookup报错: you can't use the 'integer-pair' algorithm when you have more than one key o ...
- java时间操作
这篇讲的也很专业:http://soft.zdnet.com.cn/software_zone/2007/1129/660028.shtml java中的时间操作不外乎这四种情况: 1.获取当前时间 ...