简介

本文将承接文章《Java多线程wait()和notify()系列方法使用教程》,我们将通过“两个线程交替打印100内的奇偶数”,来展示下wait()方法和notify()方法的用法和优点,当然要体现出优点,自然要通过对比不使用这两个方法实现同一功能的代码,通过这几篇文章的讲解,帮你彻底搞懂wait()方法和notify()方法的用法。

一.仅通过synchronized关键字实现交替打印奇偶数

1.实现逻辑:

创建两个线程,一个线程负责打印奇数,另一个线程打印偶数,两个线程竞争同一个对象锁,每次打印一个数字后释放锁,然后另一个线程拿到锁打印下一个数字。

2.代码实现:

public class PrintOddEven1 {private static int count;private static final Object object = new Object();public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {while (count < 100) {synchronized (object) {if ((count & 1) == 0) {System.out.println(Thread.currentThread().getName() + ":" + count++);}}}}}, "偶数线程").start();new Thread(new Runnable() {@Overridepublic void run() {while (count < 100) {synchronized (object) {if ((count & 1) == 1) {System.out.println(Thread.currentThread().getName() + ":" + count++);}}}}}, "奇数线程").start();}}

3.结果输出:

偶数线程:0
奇数线程:1
偶数线程:2
奇数线程:3
偶数线程:4
奇数线程:5
偶数线程:6
奇数线程:7
偶数线程:8
奇数线程:9
偶数线程:10

4.结果分析:

通过创建两个线程,这两个线程共享object对象锁,当一个线程打印完一个数字后,会释放对象锁,另一个线程拿到对象锁,然后判断是否为偶数(奇数),满足条件则打印。

二.通过synchronized关键字配合wait和notify方法实现交替打印奇偶数

1.实现逻辑:

无需判断数字是否是奇偶数,两个线程通过等待唤醒机制,交替打印数字。

2.代码实现:

public class PrintOddEven2 {private static int count = 0;private static final Object object = new Object();public static void main(String[] args) {new Thread(new printer(), "偶数线程,").start();new Thread(new printer(), "奇数线程,").start();}static class printer implements Runnable {@Overridepublic void run() {while (count <= 100) {synchronized (object) {// 打印数字,并立即释放锁System.out.println(Thread.currentThread().getName() + "打印:" + count++);object.notify();// 此处判断,是为了打印完了100个数字后,程序能够正常结束,否则程序将一直等待下去,耗费系统资源。if (count <= 100) {try {object.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}}}

3.结果输出:

偶数线程,打印:0
奇数线程,打印:1
偶数线程,打印:2
奇数线程,打印:3
偶数线程,打印:4
奇数线程,打印:5
偶数线程,打印:6
奇数线程,打印:7
偶数线程,打印:8
奇数线程,打印:9
偶数线程,打印:10
……省略

4.结果分析:

此种方式,写法简洁,让线程拿到对象锁后,立即打印数字,然后通过notify()释放锁,然后调用wait()方法使线程进入等待状态。另一个线程拿到锁以后,也立即打印数字,然后通过notify()释放锁,然后进入等待状态。知道打印完100以内的所有数字,两个线程都能正常停止运行。

总结

本文作为wait()notify()方法的用法示例教程,展示wait()notify()方法的用法,下一篇文章将再展示一个wait()notify()方法的使用案例《设计模式之消费者生产者模式》,将带大家继续领悟下线程唤醒通知机制使用意义所在。

建议收藏:

关于synchronized关键字wait()notify()方法的系列教程,请参考以下文章:

《Java中synchronized实现类锁的两种方式及原理解析》

《Java中synchronized实现对象锁的两种方式及原理解析》

《Java多线程wait()和notify()系列方法使用教程》

《Java多线程中notifyAll()方法使用教程》

《Java中Synchronized的可重入性和不可中断性的分析和代码验证》

《Java多线程访问Synchronized同步方法的八种使用场景》

《Java官方文档创建线程的两种方式及优点和缺点分析》

《Java中线程安全和线程不安全解析和示例》

Java两个线程交替打印奇偶数(两种方法对比)相关推荐

  1. Java 两线程交替打印奇偶数(一)

    使用synchronized 及 Object对象的wait()和notifyAll()方法, Code如下 package com.shiwei.thread;public class OddEve ...

  2. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

  3. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  4. java go多线程:两个线程交替打印 0~100 的奇偶数

    最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...

  5. java让两个线程交替_java两个线程实现: 两个线程交替打印字母和数

    两个线程交替打印字母和数字: 1A2B3C4D5E6F7G public class LockConditionTest { public static void main(String[] args ...

  6. 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

    作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...

  7. 如何让两个线程交替打印整数1-100?你的答案呢?

    前端时间下班临走前看到同事做尝试的一个题目:如何让两个线程交替打印整数1-100? 好几年没有写代码玩了,想了想,花了十多分钟写了个答案: #include<stdio.h> #inclu ...

  8. 线程打印_经典面试题——两个线程交替打印奇数和偶数

    前提 今天下班时候和同事聊天偶然听到面试题"两个线程交替打印奇数和偶数"的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视 ...

  9. c语言利用线程交替打印奇偶数,两个线程交替打印奇偶数

    序言 以前看过多线程交替打印奇偶数,知道大概怎么写,实际写的时候会卡住,特此记录下来 方法一:wait, notify,性能较差,不推荐使用 public class TestThread { pub ...

最新文章

  1. python格式化% 和 format
  2. 人工智能vs人类智能小传
  3. [武道资料]《菲律宾短棍-单棍》(Edgar Sulite Lameco Escrima Single Stick)
  4. Acwing145. 超市[C++题解]:贪心
  5. 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记
  6. c# 智能升级程序代码
  7. 自己动手写Docker系列 -- 5.1实现容器的后台运行
  8. 黄聪:C#操作Word表格的常见操作
  9. 编程控制网卡启用停用vbs版
  10. rabbitmq 一个生产者多个消费者_RabbitMQ入门学习系列(二),单生产者消费者
  11. java开发利用jacob将word转pdf
  12. 基于Springboot+vue开发实现自行车租赁管理系统
  13. 蓝桥杯 明码题解 【Java实现】
  14. 在APPLE从创建ID到申请发布AppStore账户(六)新建AppleID用户首次使用要求双重认证(您的 Apple ID 需要更新)
  15. 2022年12月奥鹏网络教育大学英语B统考题库试题
  16. 解决to_csv循环追加数据不会覆盖前面的数据
  17. C语言学会数组就可以做五子棋 - 快来试试吧(包含源码)
  18. 计算机应用说课稿,中职计算机说课稿
  19. BUUCTF-RSA学习(一)
  20. 【Javascript】shift、unshift、pop、push的区别

热门文章

  1. 又拍云 php sdk,GitHub - totoleo/php-sdk: UPYUN PHP SDK
  2. Oracle表空间查询
  3. @RunWith和@ContextConfiguration的用法
  4. idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
  5. SQLite安装与使用 (Linux)
  6. 基本保险金额和保额的意思和区别是什么?
  7. IP地址转换(c语言)
  8. cocos2d 简单消除游戏算法 (一)
  9. 计算机编程入门语言哪个好?
  10. 印度软件腾飞不是偶然