Java多线程开发——一个简单的数字加减小例子
范例:
两个线程实现加法,两个线程实现减法
class Resource {private int num = 0;private boolean flag = true;//flag = true 表示可以进行加法操作,不能进行减法操作//flag = false 表示可以进行减法操作,不能进行加法操作public synchronized void add() throws InterruptedException { //执行加法操作if (this.flag == false) { //此处应使用whilesuper.wait();}Thread.sleep(100);this.num++;System.out.println(Thread.currentThread().getName() + " 加法操作 num = " + num);this.flag = false;super.notifyAll();}public synchronized void sub() throws InterruptedException { //执行减法操作if (this.flag == true) { 此处应使用whilesuper.wait();}Thread.sleep(200);this.num--;System.out.println(Thread.currentThread().getName() + " 减法操作 num = " + num);this.flag = true;super.notifyAll();}
}class AddThread implements Runnable {private Resource resource;public AddThread(Resource resource) {this.resource = resource;}@Overridepublic void run() {for (int i = 0; i < 50; i++) {try {this.resource.add();} catch (InterruptedException e) {e.printStackTrace();}}}}class SubThread implements Runnable {private Resource resource;public SubThread(Resource resource) {this.resource = resource;}@Overridepublic void run() {for (int i = 0; i < 50; i++) {try {this.resource.sub();} catch (InterruptedException e) {e.printStackTrace();}}}}public class ThreadDemo1 {public static void main(String[] args) {Resource resource = new Resource();AddThread addThread = new AddThread(resource);SubThread subThread = new SubThread(resource);new Thread(addThread, "加法线程 - A").start();new Thread(addThread, "加法线程 - B").start();new Thread(subThread, "减法线程 - X").start();new Thread(subThread, "减法线程 - Y").start();}}
此代码中有一个问题,数字num会出现一直减一直加的问题,是因为在进行线程同步时,多个线程都通过wait()方法进入阻塞状态后,当一个线程通过notifyAll唤醒其余的线程后,阻塞状态的线程就会直接继续往下执行,所以无法实现线程同步。解决思路是线程从阻塞状态被唤醒后必须再次检验flag的值。
As in the one argument version, interrupts and spurious wakeups are possible, and this method should always be used in a loop:
synchronized (obj) {while (<condition does not hold>)obj.wait(timeout, nanos);... // Perform action appropriate to condition}
上面是官方文档的说明
所以只需要把if改成while就可以了
Java多线程开发——一个简单的数字加减小例子相关推荐
- java多线程创建一个简单的案例
1.创建一个简单的线程,不需要去创建个Runnable Thread thread = new Thread(new Runnable() {@Overridepublic void run() {/ ...
- java开发一个简单的通讯录
java开发一个简单的通讯录 ArrayList的综合应用 import java.util.*; public class ContactNote{static Scanner sc=new Sca ...
- java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...
- JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...
- java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)
java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...
- java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...
- 深度讲解Java多线程开发—电子表项目实现
目录 1.前端界面的设计 2.添加控件的事件监听 3.通过主线程对时间实时显示 4.启用线程实现对时间的修改 5.线程同步实现秒表功能 6.运行并进行调试 Hello,大家好,我是灰小猿! 今天和大家 ...
- [译]使用 Rust 开发一个简单的 Web 应用,第 4 部分 —— CLI 选项解析
原文地址:A Simple Web App in Rust, Part 4 -- CLI Option Parsing 原文作者:Joel's Journal 译文出自:掘金翻译计划 本文永久链接:g ...
- php开发mvc教程,php开发一个简单的MVC
本文通过实例为大家介绍用php开发一个简单mvc的方法,起到势砖引玉的作用,本文比较适合刚接触mvc的朋友. MVC其实就是三个Model,Contraller,View单词的简称. Model,主要 ...
最新文章
- xshell简单命令
- Android线程池封装库
- linux或者shell进入vi命令
- vue项目如何打包扔向服务器 - Hi-Sen - 博客园
- SAP License:SAP顾问的可持续性发展
- KPN iTV的敏捷转型之旅
- STP状态切换详述(Cisco实现)
- 图像拼接算法总结(一)
- 基于51单片机的8位数码管时钟设计—按键修改时间
- C#程序设计--控制台程序输出上下三角形和菱形
- 关于bss段的一些思考
- java的json解析_java中json的使用和解析
- 计算机函数countifs使用,countifs函数(countifs使用方法举例)
- 我的世界服务器显示大字,我的世界上面指令让界面出现字体 | 手游网游页游攻略大全...
- asp.net 获得根文件夹在服务器上物理路径,asp.net获取网站目录物理路径示例
- Verilog 加法器/减法器
- 短线股票怎么操作怎样才能炒好短线股票
- 战略支援部队信息工程大学的计算机类,战略支援部队信息工程大学2018年硕士研究生招生简章...
- 对routes,route,router的理解
- MSC阿里比赛第三题详解
热门文章
- 计算机word文档无法工作,win10所有word文档都打不开如何解决_win10电脑所有word文档无法打开解决教程...
- 机房温度可视化:物联网下的数据中心环境运维新方式
- office2016 Excel 打开“宏”分三步
- matlab画一元函数图
- AVR单片机用progisp下载报错flash verify error at :0h
- MySQL Replication 梳理详解
- 三分钟了解一下深度学习
- 使用vue-cli搭建SPA项目
- Win10自带录屏怎么用?一键开启,超级简单!
- JAV spi 和扩展方式