这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的。我们也知道这两个方法是实现多个线程之间的通信和互斥的,不多说了,下面就来看一下例子吧:

例子描述:

开启两个线程,子线程循环10次,主线程循环100次,如此反复循环50次

代码如下:

public static void main(String[] args) {
final Business business = new Business();
//子线程循环10次
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<50;i++){
business.sub(i);
}
}
}).start(); //主线程循环100次
for(int i=0;i<50;i++){
business.main(i);
} } /**
* 业务逻辑类
* @author weijiang204321
*
*/
static class Business{
private volatile boolean bShouldSub = true;//true表示sub执行,false表示main执行
public synchronized void sub(int i){
//将这里的if改成while,效果更好,while会再次判断,安全性高
//因为有时候线程可能被假唤醒
while(!bShouldSub){
try {
//等待
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} for(int j=0;j<=10;j++){
System.out.println("sub thread sequece of" + j + ",loop of"+i);
}
bShouldSub = false;
this.notify();//唤醒该锁的等待线程
} public synchronized void main(int i){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<=100;j++){
System.out.println("main thread sequece of" + j + ",loop of"+i);
}
bShouldSub = true;
this.notify();
}
} }

通过wait和notify机制来实现这两个线程的循环的有序性,能够保证子线程循环10次,主线程循环100次这样交替运行。

运行结果很多,这里就不截图了!这里我们也是可以看到的,调用wait方法是会释放锁的,所以他会被用到很多,这个和之前的几个方法是不同的!

注意的两点:

第一:同步代码块中的锁和调用wait和notifiy方法的对象锁一定要是同一个。

第二:wait和notify方法的调用一定要在同步代码块中,不然会报异常,可以自行测试一下。

转至:http://blog.csdn.net/jiangwei0910410003/article/details/19962565

Java中的对象Object方法之---wait()和notifiy()的更多相关文章

  1. java中获得对象的方法

  2. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...

  3. JAVA中List对象去除重复值的方法

    JAVA中List对象去除重复值,大致分为两种情况,一种是List<String>.List<Integer>这类,直接根据List中的值进行去重,另一种是List<Us ...

  4. JAVA中JavaBean对象之间属性拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...

  5. 理解Java中的对象,变量和方法

    1.对象的创建和销毁 1.1 对象的创建 这里只介绍创建对象与构造方法的关系 (1).每实例化一个对象就会自动调用一次构造方法,实质上这个过程就是创建对象的过程,准确的说,在Java语言中使用new操 ...

  6. JAVA中JavaBean对象之间拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,有个更简便的方法,他们之间的拷贝可以通过copyPro ...

  7. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  8. Java中Set的contains()方法

    Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...

  9. Java中的对象要怎样才算相等

    一.引用相等性与对象相等性 1. 引用相等性 引用到堆上同一个对象的两个引用是相等的,这就是引用的相等性. 如果想要知道两个引用是否相等,可以使用==来比较变量上的字节组合,如果引用到相同的对象,字节 ...

随机推荐

  1. Python学习_07_错误、异常

    地毯式地过语法终于快要结束了... Python中的常见异常 1.NameError:尝试访问一个未初始化的变量 2. ZeroDivisionError:除数为0 3. SyntaxError:Py ...

  2. Scrum And Teamwork

    Scrum Learning 概念 Scrum是迭代式增量软件开发过程,通常用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过程骨架.Scrum中的主要角色包括同项目经理类似的Scrum主管 ...

  3. 初步了解 Django Models

    Part1:了解主键 1.      Python和Django版本如下: E:\django>python3 -V Python 3.5.2 E:\django>python3 -m d ...

  4. Python新手需要掌握的知识点

    一.基础语法 1 变量 2 逻辑判断 3 循环 4 函数 二.数据结构 1 数字(加减乘除) 2 字符串(一串字符) 3 布尔 (真假) 4 元组 (不能修改的列表) 5 列表(Python的苦力,最 ...

  5. AFNetWorking 对汉字部分UTF-8编码

    随笔记一下 好用的小技巧 1.将字典数据拼接成url的参数... AFQueryStringFromParameters NSString *query = AFQueryStringFromPara ...

  6. js 数组API之every、some用法

    every 判断数组中是否每个元素都满足条件 只有都满足条件才返回true: 只要有一个不满足就返回false: arr.every(function(value,index,array){retur ...

  7. 总结基础OOP(面向对象)

    OOP其实也就是面向对象编程.  一:什么是对象:  我们最常见的理解方式无非是:对象(object)是任何看得见.摸得着.感觉得到,可以获得的东西,有自己的标识的任何东西.对象是某一类的事物的具体个 ...

  8. 关于linux下的date日期,并以日期给文件命名

    在linux的终端中,我们输入date后会有以下显示: 然后博主也扩展了一下date的基础用法: date + "%-": %y 输出年份的后2位:%Y 输出完整年份 %m 输出月 ...

  9. linux上配置bochs,搭建基于X86架构操作系统的开发环境

    学习操作系统最好的方法就是自己编写新的操作系统,或者修改已有的操作系统.但是如果在真机上完成这个过程,调试会成为一个很大的问题.利用虚拟机来完成,可以使调试过程变得简单,而且能节约很多开关机的时间. ...

  10. windows 下文件的高级操作

    本文主要说明在Windows下操作文件的高级方法,比如直接读写磁盘,文件的异步操作,而文件普通的读写方式在网上可以找到一大堆资料,在这也就不再进行专门的说明. 判断文件是否存在 在Windows中并没 ...