java学习之协调同步的线程
时间:2022-05-05
本文章向大家介绍java学习之协调同步的线程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合本线程的需要,
那么可以在同步方法中使用wait(),wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
其他线程如果在使用这个同步方法时,不许需要等待,那么它使用这个同步方法。其他线程如果再使用这个同步方法是不需要等待,那么它使用完
这个同步方法的同时,应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待.曾中断的线程就会从刚才的中断处继续执行
这个同步方法.....
1 /*
2 wait();
3 notify();
4 notifyAll();
5 */
在下面的列子中:
/*
张飞和李逵买电影票。售票员只有两张5元的钱,电影票5元一张。张飞
拿20元一张的人民币排在李逵的前面买票,李逵拿一张5元的人民币买票,因此张飞必须等待。
*/
1 //package Scan_boobs;
2 public class Example12_8 extends window_scan
3 {
4 public static void main(String args [] )
5 {
6 TicketHouse officer = new TicketHouse();
7 Thread zhangfei ,likui;
8 zhangfei = new Thread(officer);
9 zhangfei.setName("张飞");
10 likui = new Thread(officer);
11 likui.setName("李逵");
12 zhangfei.start();
13 likui.start();
14 }
15 }
16
17 class TicketHouse implements Runnable
18 {
19 int fiveAmount=2,tenAmount=0,twentyAmount=0;
20 @Override
21 public void run() {
22 // TODO Auto-generated method stub
23 String name=Thread.currentThread().getName();
24 if(name.equals("张飞")) saleTicket(20);
25 else saleTicket(5);
26
27 }
28 private synchronized void saleTicket(int money)
29 {
30 if(money==5)
31 {
32 fiveAmount++;
33 this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
34 +Thread.currentThread().getName()+"的钱正好");
35 }
36 else if(money==20)
37 {
38 while(fiveAmount<3)
39 {
40 try {
41 this.out("n"+Thread.currentThread().getName()+"靠边等....");
42 wait();
43 // Thread.sleep(3000);
44 this.out("n"+Thread.currentThread().getName()+"继续买票");
45 } catch (InterruptedException e) {
46 // TODO Auto-generated catch block
47 e.printStackTrace();
48 }
49 }
50 fiveAmount-=3;
51 twentyAmount++;
52 this.out("给"+Thread.currentThread().getName()+"入场卷,"
53 +Thread.currentThread().getName()+"给20,找赎15元");
54 }
55 notifyAll();
56 }
57 private void out(String name)
58 {
59 System.out.println(name);
60 }
61 }
需要特别注意:
/*
在许多实际的问题中wait方法应当放在一个"while(等待的条件){}"的循环语句中,而不是“if(等待条件){}的分支语句中”
*/
如果咸的蛋疼了,将wait(); ----》改为 Thread.sleep(); 然后呵呵,你会就会这样
代码:
1 package Scan_boobs;
2 public class Example12_8 extends window_scan
3 {
4 public static void main(String args [] )
5 {
6 TicketHouse officer = new TicketHouse();
7 Thread zhangfei ,likui;
8 zhangfei = new Thread(officer);
9 zhangfei.setName("张飞");
10 likui = new Thread(officer);
11 likui.setName("李逵");
12 zhangfei.start();
13 likui.start();
14 }
15 }
16
17 class TicketHouse implements Runnable
18 {
19 int fiveAmount=2,tenAmount=0,twentyAmount=0;
20 @Override
21 public void run() {
22 // TODO Auto-generated method stub
23 String name=Thread.currentThread().getName();
24 if(name.equals("张飞")) saleTicket(20);
25 else saleTicket(5);
26
27 }
28 private synchronized void saleTicket(int money)
29 {
30 if(money==5)
31 {
32 fiveAmount++;
33 this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
34 +Thread.currentThread().getName()+"的钱正好");
35 }
36 else if(money==20)
37 {
38 while(fiveAmount<3)
39 {
40 try {
41 this.out("n"+Thread.currentThread().getName()+"靠边等....");
42 wait();
43 // Thread.sleep(3000);
44 this.out("n"+Thread.currentThread().getName()+"继续买票");
45 } catch (InterruptedException e) {
46 // TODO Auto-generated catch block
47 e.printStackTrace();
48 }
49 }
50 fiveAmount-=3;
51 twentyAmount++;
52 this.out("给"+Thread.currentThread().getName()+"入场卷,"
53 +Thread.currentThread().getName()+"给20,找赎15元");
54 }
55 notifyAll();
56 }
57 private void out(String name)
58 {
59 System.out.println(name);
60 }
61 }
效果图:
- 初步解读Golang中的接口相关编写方法
- Go语言获取Windows下文件是否隐藏
- Java案例-求a+aa+aaa+.......+aaaaaaaaa=?
- 【Go 语言社区】算法课程 第一季 第6节 建立三角形
- 最近的几个技术问题总结和答疑(五)(r9笔记第9天)
- hive学习笔记——Hive表中数据的导入和导出
- Java案例-求和与打印九九乘法表
- hive学习笔记——Hive表的创建
- 和开发讨论的一个数据变更需求(r9笔记第8天)
- Java案例-分数查等级程序
- Go语言的标准输入-scan 和bufio
- Java案例-判断给定年份是闰年
- 分分钟搭建Oracle环境 (r9笔记第23天)
- Java面试系列25-spring(4)-国际化、加入web容器,标签、事务等
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android中封装RecyclerView实现添加头部和底部示例代码
- Python 十六进制hex-bytes-str之间的转换和Bcc码的生成
- android中实现手机号码的校验的示例代码
- Android ListView实现下拉加载功能
- Android 截图功能源码的分析
- Docker下搭建禅道管理系统
- Android如何通过Retrofit提交Json格式数据
- python-jsonpath 解析神器
- Android中自定义ImageView添加文字设置按下效果详解
- Android中使用Kotlin实现一个简单的登录界面
- Android编程实现webview将网页打包成apk的方法
- Android 实现代码混淆的实例
- Android中复制图片的实例代码
- Android 两种启动模式的实例详解
- Retrofit2.0 实现图文(参数+图片)上传方法总结