博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程学习总结之三:线程间的协作
阅读量:6235 次
发布时间:2019-06-22

本文共 1097 字,大约阅读时间需要 3 分钟。

hot3.png

这里主要研究Object的方法wait()、notify()和notifyAll()来安全的实现进程间的握手。此外java se5并发类库提供了具有await()和signal()方法的Condition对象。注意wait()、notify()和notifyAll()方法只能在同步控制方法或同步控制块里调用。

wait()方法有两种形式。第一种为接受毫秒数作为参数,含义与sleep()方法里参数的意思相同。但与sleep()不同的是,对于wait()而言:

1)在wait期间对象锁是释放的

2)通过notify()和notifyAll(),或者令时间到期,从wait()中恢复执行

第二种是不接受任何参数。这种方法无限等待下去,直到线程接收到notify()和notifyAll()方法。

例子:

class Thread2 extends Thread{	int total;	public void run(){		synchronized(this){			for(int i=0;i<101;i++){				total+=i;			}			try {				sleep(10000);			} catch (InterruptedException e) {				e.printStackTrace();			}			notify();		}	}}public class Thread1 {	public static void main(String[] args){		Thread2 b = new Thread2();		b.start();		synchronized(b){			try{				System.out.println("等待对象b完成计算。。。");				b.wait();			}catch (Exception e) {				e.printStackTrace();			}			System.out.println("b对象计算的总和是:" + b.total); 		}	}}
等待对象b完成计算。。。 b对象计算的总和是:5050

注意当在对象上调用wait()方法时,执行该代码的线程立即放弃它在对象上的锁。然而调用notify()时,并不意味着这时线程会放弃其锁。

如果要向对象x发送notifyAll(),那么就必须在能够取得x的锁的同步控制块中这么做

synchronized(x){       x.notifyAll();}

 

 

转载于:https://my.oschina.net/coolbash/blog/112936

你可能感兴趣的文章
C++11 正则表达式——基础知识介绍
查看>>
jquery 日期+时间 date & time 插件
查看>>
【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)...
查看>>
jsoncpp v0.5中的一个bug
查看>>
DNS报文格式(RFC1035)
查看>>
停下来,等等灵魂(二)
查看>>
在Android中实现service动态更新UI界面
查看>>
找出数字在已排序数组中出现的次数
查看>>
Linux驱动学习笔记(6)信号量(semaphore)与互斥量(mutex)【转】
查看>>
DotNET企业架构应用实践-系列目录
查看>>
iOS开发-UITextView根据内容自适应高度
查看>>
将两个价格清单放在一行显示
查看>>
asp.net gridview 和 repeater 模板代码示例
查看>>
mdev的基本工作原理【转】
查看>>
[Git] git shortlog 找出最懒的程序员
查看>>
【区块链之技术进阶】扒一扒某乎上面对于区块链的理解(二)
查看>>
LintCode: Sort Colors
查看>>
HDU 5095 Linearization of the kernel functions in SVM(模拟)
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入
查看>>
Java 内存查看与分析
查看>>