范例:

两个线程实现加法,两个线程实现减法

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多线程开发——一个简单的数字加减小例子相关推荐

  1. java多线程创建一个简单的案例

    1.创建一个简单的线程,不需要去创建个Runnable Thread thread = new Thread(new Runnable() {@Overridepublic void run() {/ ...

  2. java开发一个简单的通讯录

    java开发一个简单的通讯录 ArrayList的综合应用 import java.util.*; public class ContactNote{static Scanner sc=new Sca ...

  3. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  4. JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  5. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  6. java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...

  7. 深度讲解Java多线程开发—电子表项目实现

    目录 1.前端界面的设计 2.添加控件的事件监听 3.通过主线程对时间实时显示 4.启用线程实现对时间的修改 5.线程同步实现秒表功能 6.运行并进行调试 Hello,大家好,我是灰小猿! 今天和大家 ...

  8. [译]使用 Rust 开发一个简单的 Web 应用,第 4 部分 —— CLI 选项解析

    原文地址:A Simple Web App in Rust, Part 4 -- CLI Option Parsing 原文作者:Joel's Journal 译文出自:掘金翻译计划 本文永久链接:g ...

  9. php开发mvc教程,php开发一个简单的MVC

    本文通过实例为大家介绍用php开发一个简单mvc的方法,起到势砖引玉的作用,本文比较适合刚接触mvc的朋友. MVC其实就是三个Model,Contraller,View单词的简称. Model,主要 ...

最新文章

  1. xshell简单命令
  2. Android线程池封装库
  3. linux或者shell进入vi命令
  4. vue项目如何打包扔向服务器 - Hi-Sen - 博客园
  5. SAP License:SAP顾问的可持续性发展
  6. KPN iTV的敏捷转型之旅
  7. STP状态切换详述(Cisco实现)
  8. 图像拼接算法总结(一)
  9. 基于51单片机的8位数码管时钟设计—按键修改时间
  10. C#程序设计--控制台程序输出上下三角形和菱形
  11. 关于bss段的一些思考
  12. java的json解析_java中json的使用和解析
  13. 计算机函数countifs使用,countifs函数(countifs使用方法举例)
  14. 我的世界服务器显示大字,我的世界上面指令让界面出现字体 | 手游网游页游攻略大全...
  15. asp.net 获得根文件夹在服务器上物理路径,asp.net获取网站目录物理路径示例
  16. Verilog 加法器/减法器
  17. 短线股票怎么操作怎样才能炒好短线股票
  18. 战略支援部队信息工程大学的计算机类,战略支援部队信息工程大学2018年硕士研究生招生简章...
  19. 对routes,route,router的理解
  20. MSC阿里比赛第三题详解

热门文章

  1. 计算机word文档无法工作,win10所有word文档都打不开如何解决_win10电脑所有word文档无法打开解决教程...
  2. 机房温度可视化:物联网下的数据中心环境运维新方式
  3. office2016 Excel 打开“宏”分三步
  4. matlab画一元函数图
  5. AVR单片机用progisp下载报错flash verify error at :0h
  6. MySQL Replication 梳理详解
  7. 三分钟了解一下深度学习
  8. 使用vue-cli搭建SPA项目
  9. Win10自带录屏怎么用?一键开启,超级简单!
  10. JAV spi 和扩展方式