当前位置: 首页 > news >正文

java多线程学习总结之三:线程间的协作

2019独角兽企业重金招聘Python工程师标准>>> 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

相关文章:

  • JB4.2:添加一个SwithButton控制ShutterSound
  • Linux下取本机所有网口的ip地址
  • android 蓝牙源码分析
  • 新版本的GNS3(0.8.2)模拟ASA的教程
  • LVM的综合性介绍及实现
  • (实战篇)如何缓存数据
  • android 抓包分析
  • 从外形如何分辨iTouch是几代的?
  • Word中使用正则表达式进行查找和替换
  • 打开Windows2008 R2 Server Manager或执行Windows Update时出现0x800F0818错误
  • 针对11.2 RAC丢失OCR和Votedisk所在ASM Diskgroup的恢复手段
  • Linux 获取CPU温度
  • OpenCV第五章练习p163_5~8
  • 用gdbserver调试共享库(二)
  • java类型通配符
  • php的引用
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 345-反转字符串中的元音字母
  • angular组件开发
  • ES10 特性的完整指南
  • spark本地环境的搭建到运行第一个spark程序
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 复杂数据处理
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 聊聊sentinel的DegradeSlot
  • 每天一个设计模式之命令模式
  • 如何在GitHub上创建个人博客
  • 算法-图和图算法
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • kubernetes资源对象--ingress
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # Panda3d 碰撞检测系统介绍
  • #if 1...#endif
  • #微信小程序:微信小程序常见的配置传旨
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4.10~4.16)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (一) storm的集群安装与配置
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)nsfocus-绿盟科技笔试题目
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Standard 的管理策略
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET建议使用的大小写命名原则
  • @vue/cli 3.x+引入jQuery
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]如何调试Native memory crash issue