Java多线程编程:交替打印数字1234和字母abcd

  • 1. 使用synchronized同步锁
  • 2. 使用LockSupport类
    • 2.1 LockSupport介绍
  • 3. 使用AtomicInteger原子类

1. 使用synchronized同步锁

使用synchronized锁时需要用到Object类的wait() 和 notify() 方法,值得注意的是:
(1) wait() 和 notify() 方法都是Object类里面的,两者均需要在同步方法或同步代码块之中才能使用
(2) wait() 和 notify() 方法的调用者,如果是同步代码块,则是synchronized锁定的对象来调用;如果是同步方法,则this来调用;
(3) 在同步环境中调用了wait()方法后,该线程释放锁,并等待在当前代码行处,直到其他线程调用了notify() 或 notifyAll() 方法,该线程才继续执行wait()方法的下一句代码。

/*
* @Author: QR.Xu
* @Date: 2021/3/27
* @Description: 交替打印数字1234和字母abcd
* */
public class multiThreadAlternatePrintDemo1 {public static void main(String[] args) {final Object lockObj = new Object();Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 4; i++) {synchronized (lockObj) {System.out.print(i);lockObj.notify();try {lockObj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}});Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 4; i++) {char c = (char) ('a' + i);synchronized (lockObj) {System.out.print(c);lockObj.notify();try {lockObj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}synchronized (lockObj) {lockObj.notify();}}});thread1.start();thread2.start();}
}

2. 使用LockSupport类

2.1 LockSupport介绍

LockSupport继承自Object类,类路径为:java.util.concurrent.locks.LockSupport。
作用:用来创建锁和其他同步类的基本线程阻塞原语。
LockSupport提供了park()和unpark()方法实现阻塞线程和解除线程阻塞。

由于许可的存在,调用 park 的线程和另一个试图将其 unpark 的线程之间的竞争将保持活性。此外,如果调用者线程被中断,并且支持超时,则 park 将返回。park 方法还可以在其他任何时间“毫无理由”地返回,因此通常必须在重新检查返回条件的循环里调用此方法。从这个意义上说,park 是“忙碌等待”的一种优化,它不会浪费这么多的时间进行自旋,但是必须将它与 unpark 配对使用才更高效。
/*
* @Author: QR.Xu
* @Date: 2021/3/27
* @Description: 交替打印数字1234和字母abcd
* */
import java.util.concurrent.locks.LockSupport;public class multiThreadAlternatePrintDemo2 {static Thread thread1 = null, thread2 = null;public static void main(String[] args) {char[] number = "1234".toCharArray();char[] alpha = "abcd".toCharArray();thread1 = new Thread(new Runnable() {@Overridepublic void run() {for (char c : number) {System.out.print(c);LockSupport.unpark(thread2);LockSupport.park();}}});thread2 = new Thread(() ->{for (char c : alpha) {LockSupport.park();System.out.print(c);LockSupport.unpark(thread1);}});thread1.start();thread2.start();}
}

3. 使用AtomicInteger原子类

Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,Atomic原子类指的是具有原子/原子操作特征的类。而AtomicInteger则是操作int数据类型的原子类。
AtomicInteger 类主要利用 CAS (compare and swap) + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。
关于CAS,有兴趣的小伙伴可以看这篇博文,“什么是CAS机制?”。

/*
* @Author: QR.Xu
* @Date: 2021/3/27
* @Description: 交替打印数字1234和字母abcd
* */
import java.util.concurrent.atomic.AtomicInteger;public class multiThreadAlternatePrintDemo3 {static Thread thread1 = null, thread2 = null;static AtomicInteger state= new AtomicInteger(0);public static void main(String[] args) {char[] number = "1234".toCharArray();char[] alpha = "abcd".toCharArray();thread1 = new Thread(new Runnable() {@Overridepublic void run() {for (char c : number) {while (state.get() != 0) { // 用于阻塞线程thread1}System.out.print(c);state.set(1);}}});thread2 = new Thread(){public void run(){for (char c : alpha) {while (state.get() != 1) { // 用于阻塞线程thread2}System.out.print(c);state.set(0);}}};thread1.start();thread2.start();}
}

另外:关于线程的创建方式有多种,代码里也向大家展示了几种最常用的方式,仅供大家参考。

Java多线程编程:交替打印数字1234和字母abcd相关推荐

  1. Java 多线程 不使用锁机制 实现交替打印数字和字母

    Java 多线程 不使用锁机制 实现交替打印数字和字母 这是一道经典的面试题,使用两个线程去交替打印数字和字母,输出1A2B3C4D5E6F7G-这样的效果,看了网上很多的文章,基本都是使用Condi ...

  2. 计算机是如何工作的,Java多线程编程

    一.冯诺依曼体系 现代的计算机,大多遵守 冯诺依曼体系结构 (Von Neumann Architecture) CPU 中央处理器: 进行算术运算和逻辑判断. AMD Ryzen 7 580OU w ...

  3. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  4. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  5. Java多线程编程那些事:volatile解惑--转

    http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员"熟悉而又陌 ...

  6. Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

    前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  7. 多线程和单线程 打印数字到100000 的速度对比

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.u ...

  8. 《Java多线程编程核心技术》——1.5节sleep()方法

    本节书摘来自华章社区<Java多线程编程核心技术>一书中的第1章,第1.5节sleep()方法,作者高洪岩,更多章节内容可以访问云栖社区"华章社区"公众号查看 1.5 ...

  9. Java 多线程编程 实验题

    Java 多线程编程 实验二 1.创建键盘操作练习 2. 双线程猜数字 3. 月亮围绕地球 1.创建键盘操作练习 题目描述: 编写一个Java应用程序,在主线程中再创建两个线程, 一个线程负责给出键盘 ...

最新文章

  1. FCGF-基于稀疏全卷积网络的点云特征描述子提取(ICCV2019)
  2. 大促系统全流量压测及稳定性保证——京东交易架构
  3. 聊聊 MySql 索引那些事儿
  4. 015 Android之可执行文件dex
  5. 了解systemctl和chkconfig的服务管理工具
  6. decode函数的使用
  7. 你真的了解JS数组的那些方法吗?
  8. input 限制输入
  9. 读书笔记_打开量化投资的黑箱06
  10. 脑瘫男孩17岁考上大学,毕业在家工作每月7500,成为公司骨干
  11. Java 8 Optional
  12. 电脑版微信如何实现消息批量发送
  13. linux系统下制作启动u盘,在Linux系统下如何制作创建win10启动盘U盘启动?
  14. Python微博评论进行情感分析
  15. 《程序员》沉痛悼念王江民先生
  16. Unity 截屏时,安卓和编辑器下,Rect的坑
  17. 学习C C++的必备技能(1)
  18. 让学前端不再害怕英语单词(四)
  19. 滚铁环,跳橡皮筋,斗鸡,打弹珠,老鹰捉小鸡…………
  20. python append使用方法

热门文章

  1. 10.Java面向对象进阶2
  2. 如何面试Java中级开发(16k)试题讲解和Java学习
  3. 丝网印刷的作用原理及异常分析
  4. 2022重庆幼教产业展览会|高科技玩具益智解压玩具博览会
  5. c罗python可视化分析_梅西、内马尔谁是全能的五边形战士?教你用BI做出可视化能力图...
  6. Google挥刀自宫给站长看
  7. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间
  8. 众口难调的网站导航条
  9. 再见了,MySQL之父!
  10. Java 之父求职被嫌年纪大