- 浏览: 158677 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zhousheng193:
非常感谢LZ
在JSP页面及servlet的doGet()方法中处理汉字乱码的问题 -
jie523314:
学习下。。。
读取XML文件
通常,多线程之间需要协调工作,例如两个人公用一个卫生间(每次只能一个人用),一个人必须等待另一个人用完,得知没有人使用的时候才能使用卫生间。
以上逻辑简单说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在java中,这个机制的实现依赖于wait() 和notify()。等待机制与锁机制密切关联的。例如
当线程A获得了obj锁后,发现条件condition不满足,就无法下一处理,于是线程A就等待(调用wait()方法)。
在另外一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:
如果以使用卫生间作为示例,假设他们都要刷牙和洗脸。他们是这样约定的:轮流用,第一个人现刷牙,然后第二人刷牙;第一个人洗脸,然后第二个人洗脸。程序代码如下所示:
运行该示例,结果如下
People 1 is brushing!
People 1 is brushed!
People 2 is brushing!
People 2 is brushed!
People 1 is releasing!
People 1 is released!
People 2 is releasing!
People 2 is released!
以上逻辑简单说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在java中,这个机制的实现依赖于wait() 和notify()。等待机制与锁机制密切关联的。例如
synchronized(obj){ while(!condition){ obj.wait(); } }
当线程A获得了obj锁后,发现条件condition不满足,就无法下一处理,于是线程A就等待(调用wait()方法)。
在另外一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:
synchronized(obj){ condition = true; obj.notify(); }
如果以使用卫生间作为示例,假设他们都要刷牙和洗脸。他们是这样约定的:轮流用,第一个人现刷牙,然后第二人刷牙;第一个人洗脸,然后第二个人洗脸。程序代码如下所示:
package tarena; public class Syn { public static void main(String[] args) { TwoPeople.ONE.start(); TwoPeople.TWO.start(); } } class TwoPeople extends Thread { private int i = 0; static Thread ONE = new TwoPeople(1); static Thread TWO = new TwoPeople(2); static Object lock = new Object(); private TwoPeople(int i) { this.i = i; } public void run() { synchronized (lock) { try { if (i == 1) { this.brush();//1 people one brush lock.wait();//2 释放当前对象,进入等待状态 this.release();//6 线程1 获取当前锁对象,并开始 people one release lock.notify();//7 注意:对象锁只能单一操作不能将该对象锁锁住, //所以这里只需要唤醒 线程2,进入就绪状态 } else { this.brush();//3 线程2 people two brush lock.notify();//4 唤醒 线程1 并进入就绪状态 lock.wait();//5 释放当前锁对象,让出CPU资源,使线程1 获取锁对象 this.release();//8 获取对象锁,进入执行状态,最后run()结束 } } catch (InterruptedException e) { e.printStackTrace(); } } } private void brush() { System.out.println("People " + i + " is brushing!"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("People " + i + " is brushed!"); } private void release() { System.out.println("People " + i + " is releasing!"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("People " + i + " is released!"); } }
运行该示例,结果如下
引用
People 1 is brushing!
People 1 is brushed!
People 2 is brushing!
People 2 is brushed!
People 1 is releasing!
People 1 is released!
People 2 is releasing!
People 2 is released!
发表评论
文章已被作者锁定,不允许评论。
-
3种常见的设计模式
2010-09-30 14:01 943工厂模式: 引用 定义一个创建产品对象的工厂类,由该工厂统 ... -
Eclipse6.0 代码提示(代码助手) 设置方法
2010-08-30 09:53 1349在MyEclipse6.0的快捷键中 ... -
Byte[]数组与其他数据类型相互转换
2010-07-22 18:53 859Byte[]数组与其他数据类型相互转换 //Byte[ ... -
byte[] 转换成 int
2010-07-22 18:33 1042一个完整的byte[]转换成int byte[] b= n ... -
用java对图片进行绘画
2010-07-07 09:28 898package com.java.test_IO; im ... -
怎么用java删除父文档及子文档
2010-07-06 19:16 1004package org.tarena.day01; ... -
我的收藏网址
2010-06-29 17:36 576纯属个人收藏,不知道的不要乱点!! 引用 swing组件的使用 ... -
JAVA面试题-CORE JAVA部分
2010-06-28 21:10 1787引用1.在main(String[] args ... -
五种常见的异常
2010-06-25 18:52 751引用五种常见的异常 package day14.tar ... -
理解Java 抽象类(abstract Class)与接口(interface)
2010-06-25 11:30 965abstract class 和interface是J ... -
理解final,finally,finalize三者区别
2010-06-25 09:28 1844final关键字 我们首先来说说final。它可以用于以下四个 ... -
Java 重写Object类的常见方法
2010-06-25 08:50 1526引用 当我们写一个类的时候,都会对Java.la ... -
Java面试问题
2010-06-24 21:01 1453引用Java常见面试题集锦 ... -
浅克隆和深克隆的理解和区别
2010-06-24 20:21 2591引用 今天,和同学讨论了下java的clone( ... -
用户登录界面代码
2010-06-24 09:38 3030引用注:这只是个登录测试参考,是练习知识点用的, 具体功能不完 ... -
猜数字游戏
2010-06-23 21:01 752package org.text.day01; impo ... -
简易计算器
2010-06-23 20:05 701package org.tarena.day01; im ... -
java图片浏览器(娱乐)
2010-06-23 19:58 1811package org.tarena.day02; im ...
相关推荐
wait和notify讲解
主线程去控制子线程wait与notify
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。
Java 同步方式 wait和notify/notifyall
主要介绍了java多线程wait,notify,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家一起来学习一下吧
使用Java多线程的wait和notify方法实现最简单的生产者消费者模式
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
一个理解wait()与notify()的例子,让你更好理解.
源码—Java多线程5—死锁和wait notify notifyAll
java多线程之wait,notify的用法([ 详解+实例 ]).
本篇文章是对java多线程wait()和notify()进行了详细的分析介绍,需要了解的朋友参考下
wait,notify等线程知识.pdf
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
3(深入理解Wait、Notify和Wait与sleep区别).rar
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java多线程的样例代码,工程,内含wait()、notify()和sychronized的使用范例。
JAVAWAIT和NOTIFY的用法.pdf
java-wait和notify的用法.pdf
java多线程下wait和notify的作用