线程以及数据对象的wait()和notifyAll()方法
正在运行的程序称作一个进程,一个进程可以包含多个线程,这些线程可以共享进程的资源,它们共用一块存储空间。那么,各个线程在访问同一个数据对象的同时,可能引起冲突,以生产者、消费者为例,就会出现队列中没有产品的情况下,消费者扔到队列中去拿产品,与现实世界中逻辑不相符合。使用synchronized关键字可以确保线程的安全运行。
synchronized(obj){
.......
obj.wait()/notifyAll();//是数据对象而不是线程调用wait和notifyAll方法
}
当给一个线程(比如A线程)的run方法体内加入上述代码时,说明A线程必须首先获得该数据对象的锁,才能对这个对象进行操作。A线程拿到这个obj数据对象的锁以后,在它释放以前任何其它线程都不能够操作此对象了,之所以这样,我们可以认为其它线程没有这把锁的钥匙。A线程执行obj.wait()方法后,它将释放其所占有的对象锁,A线程进入阻塞状态,同时A也就不具有了获得obj对象所的权力,这样其它线程就可以拿到这把锁了。obj.notifyAll()可以唤醒因obj对象而阻塞的所有线程,并允许它们有获得对象所的权力,obj.notify()是唤醒因obj对象而阻塞的任意一个线程。
下面的程序模仿生产者和消费者:
public class WaitAndNotify {
private static List<Double> queue;
public WaitAndNotify(){
queue = new ArrayList<Double>();
} public void begin(){
Thread producer = new Thread(){
public void run(){
while(true){
synchronized(queue){
double time = 1.0d;
long startTime = System.currentTimeMillis();
if(System.currentTimeMillis()-startTime>=time){
startTime =System.currentTimeMillis();
for(int i=0;i<10;i++){
queue.add((Math.random()*10000));
}
queue.notifyAll();
}
}
}
}
};
producer.start(); Thread consumer = new Thread(){
public void run(){
while(true){
synchronized(queue){
while(queue.isEmpty()){
System.out.println("队列的长度为:"+queue.size());
try {
queue.wait();
} catch (InterruptedException ex) {
Logger.getLogger(WaitAndNotify.class.getName()).log(Level.SEVERE, null, ex);
}
}
double result = queue.remove(0);
System.out.println("成功从队列中取到数据!"+result);
}
}
}
};
consumer.start();
} public static void main(String[] args){
WaitAndNotify obj = new WaitAndNotify();
queue.add(0.1231d);
obj.begin();
}
}
producer线程向queue中放入数据,并掉调用queue.notifyAll()来唤醒所有阻塞的线程,consumer线程从queue中取数据,当没有数据时该线程就会进入阻塞状态,等待呗唤醒。
线程以及数据对象的wait()和notifyAll()方法的更多相关文章
- JAVA--线程wait()、lnotify()和notifyAll()方法
join()方法是Thread类的一个方法,而wait().notify().notifyAll()是java.lang.Object类的方法,这意味着,任何一个Java对象(包括线程对象)都有wai ...
- java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍
(原创,转载请说明出处!谢谢--http://www.cnblogs.com/linguanh/) 此文目的为了帮助大家较全面.通俗地了解线程 Thread 相关基础知识! 目录: --线程的创建: ...
- muduo网络库源码学习————线程特定数据
muduo库线程特定数据源码文件为ThreadLocal.h //线程本地存储 // Use of this source code is governed by a BSD-style licens ...
- R语言入门(2)-数据对象
数据对象 创建向量相关的方法 R语言的向量用法非常像python, 就比如这个seq(0,10,2), 从0到10, 步长为2, 涉及到的元素作为向量里的内容进行创建. 这里的用法非常像Matlab, ...
- 多线程协作wait、notify、notifyAll方法简介理解使用 多线程中篇(十四)
在锁与监视器中有对wait和notify以及notifyAll进行了简单介绍 所有对象都有一个与之关联的锁与监视器 wait和notify以及notifyAll之所以是Object的方法就是因为任何一 ...
- Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法
Java对象中的wait,notify以及notifyAll方法 在Java的Object类中包含了3个final的方法,这三个方法允许线程来交流资源是否被锁定.这三个方法就是wait(),notif ...
- 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别
前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...
- Object类中wait带参方法和notifyAll方法和线程间通信
notifyAll方法: 进入到Timed_Waiting(计时等待)状态有两种方式: 1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态 2. ...
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
随机推荐
- 搜索本地网络内所有可用的SQl实例
'搜索本地网络内所有可用的SQl实例 Dim instance As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance Dim dt ...
- SCSS是什么
SCSS即是SASS的新语法,是Sassy CSS的简写,是CSS3语法的超集,也就是说所有有效的CSS3样式也同样适合于SASS. SASS是CSS3的一个扩展,增加了规则嵌套.变量.混合.选择器继 ...
- C#抽象工厂简单实现类
曾经参与开发过的的项目,一般都是采用MVC模式进行开发,大概框架图如下: web界面层调用BLL业务层,BLL通过抽象工厂DALFactory动态生成继承了IDAL的数据库操作层实例,以进行对数据库的 ...
- 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:
在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...
- java新手笔记33 多线程、客户端、服务器
1.Mouse package com.yfs.javase; public class Mouse { private int index = 1; private boolean isLive = ...
- ArcSDE for oracle10g安装后post的时候出现错误
The Post Installation Setup can not locate required Oracle files in your path.Check your Oracle inst ...
- COM 学习小记录
COM组件程序:模块,它可以是 动态连接库(DLL) && 可执行程序(EXE),称为 进程内组件(in-of-process component) && 进程外组件( ...
- rpm与yum命令的初步认识
RPM:Red Hat package manager(RedHat软件包管理工具),现在为RPM is Package Manager好比windows里的文件扩展名为·exe的软件包. RPM的包 ...
- [CSS]浮动的那点事儿
元素是怎样浮动 元素的水平方向浮动,意味着元素只能左右移动而不能上下移动. 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 浮动元素之后的元素将围绕它. 浮动元素 ...
- 【C#高级编程(学习与理解)】1.1 C#与.NET的关系
1.C#语言不能孤立使用,而必须和.NET Framework一起考虑.C#编译器专门用于.NET,这表示用C#编写的所有代码总是在.NET Framework中运行. 2.C#就其本身而言只是一种语 ...