有三个线程,分别只能打印A,B和C要求按顺序打印ABC,打印10次(多种方法,小白也懂)

news/2024/11/9 2:19:59/

目录

第一种方法:使用LockSupport的park和unpark功能(推荐)

第二种方式:synchronized+wait+notify

第三种:暴力循环方法(不推荐)


第一种方法:使用LockSupport的park和unpark功能(推荐)

简单来说我们有一个名为LockSupport的方法

park就是阻塞当前进程

unpark就是取消阻塞让其继续执行

我们要循环打印ABC三个线程的三个字母

那么我们就可以让三个线程按顺序阻塞和解锁,就能完成打印

代码

import java.util.concurrent.locks.LockSupport;public class demo2 {static Thread t1,t2,t3;public static void main(String[] args) {t1 = new Thread(()->{for (int i = 0; i < 10; i++) {LockSupport.park();System.out.print("A");LockSupport.unpark(t2);}});t2 = new Thread(()->{for (int i = 0; i < 10; i++) {LockSupport.park();System.out.print("B");LockSupport.unpark(t3);}});t3 = new Thread(()->{for (int i = 0; i < 10; i++) {LockSupport.unpark(t1);LockSupport.park();System.out.println("C");}});t1.start();t2.start();t3.start();}
}

第二种方式:synchronized+wait+notify


实际上就是把第一种方式换为用这种方式实现

同样还是控制加锁顺序和解锁顺序罢了

public class demo3 {public static Object ob = new Object();static boolean  Ais = false;static boolean Bis = false;public static void main(String[] args) {Thread t1 = new Thread(()->{synchronized (ob){System.out.print("A");Ais = true;ob.notifyAll();}});Thread t2 = new Thread(()->{synchronized (ob){while(!Ais){try {ob.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.print("B");Bis = true;ob.notifyAll();}});Thread t3 = new Thread(()->{synchronized (ob){while(!Bis){try {ob.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("C");}});for (int i = 0; i < 10; i++) {t1.run();t2.run();t3.run();}}
}

 

 

第三种:暴力循环方法(不推荐)

就...相当于创建三十个线程了....如果实在想不起来其他方法就用这个吧....

public class demo2 {public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 10 ; i++) {Thread t1 = new Thread(()->{System.out.print("A");});t1.start();t1.join();Thread t2 = new Thread(()->{System.out.print("B");});t2.start();t2.join();Thread t3 = new Thread(()->{System.out.println("C");});t3.start();t3.join();}}
}

 


http://www.ppmy.cn/news/514766.html

相关文章

【Vuejs】1720- 详细聊一聊 Vue3 动态组件

&#x1f449; 「相关文章」 深入浅出 Vue3 自定义指令6 个你必须明白 Vue3 的 ref 和 reactive 问题初中级前端必须掌握的 10 个 Vue 优化技巧分享 15 个 Vue3 全家桶开发的避坑经验 动态组件[1]是 Vue3 中非常重要的一个组件类型&#xff0c;它可以让我们在不同的场景下灵活地…

各种品牌的Andr​​oid智能手机在Aliexpress.comstore833807

各种品牌的Andr​​oid智能手机在Aliexpress.comstore833807   三星Galaxy S3的   的Andr​​oid 4.3更新发布   如果你拥有三星Galaxy S3的国际版&#xff0c;你就是幸运的。而Android 4.3更新终于开始推出的前旗舰产品。   具体而言&#xff0c;银河S3手机有型号GT-I…

android备份卡刷包,Android 4.3 卡刷版的Root包

Android 4.3恐怕要成为历史上最悲剧的操作系统了&#xff0c;因为它还没有正式发布的时候就被Root了。 日前&#xff0c;网上泄露出原生版Galaxy S4所使用的Android 4.3 ROM&#xff0c;经网友实测之后发现搭载骁龙600处理器的美版Galaxy S4(GT-I9505)可以完美运行这一ROM&…

linux 编译指cpu内核,Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?

问题&#xff1a;我有个 Linux 进程运行在多核处理器系统上。怎样才能找出哪个 CPU 内核正在运行该进程&#xff1f; 当你在 多核 NUMA 处理器上运 行需要较高性能的 HPC(高性能计算)程序或非常消耗网络资源的程序时&#xff0c;CPU/memory 的亲和力是限度其发挥最大性能的重要…

抢班夺权成新跳水王 三星S5周爆跌近2k

三星今年的首款旗舰手机GALAXY S5如期而至&#xff0c;相比上一代的GALAXY S4&#xff0c;正面外观变化不大&#xff0c;后盖采用类皮革质地的塑料材质&#xff0c;配置上搭载高通骁龙800处理器&#xff0c;最高主频2.5GHz&#xff0c;运行内存2GB&#xff0c;机身存储空间为16…

i9500android操作系统跑流量,三星I9500刷机包 百度云ROM54公测版 因为专注 所以精进...

三星Galaxy S4是三星电子在2013年推出的一款手机&#xff0c;搭载的是Exynos 5410双四核处理器&#xff0c;支持ARM的big.LITTLE Processing省电技术&#xff0c;是A7A15的组合(基于Cortex-A15架构&#xff0c;主频1.6GHz、基于Cortex-A7架构&#xff0c;主频1.2GHz。 GPU为Ima…

webpakc原理之开发一个清除console.log(xxx)的loader

一、webpack中清除console的方法 当然想要清除console我们可以使用babel-loader结合babel-plugin-transform-remove-console插件来实现。 安装babel-loader和babel-plugin-transform-remove-console插件 npm install babel-loader babel-plugin-transform-remove-console -D…

QQ自定义登录模拟器

QQ模拟登陆 - 安卓版 软件介绍&#xff1a;一款QQ号码模拟登录效果图生成软件&#xff0c;通过使用这款软件&#xff0c;您可以模拟任何QQ账号&#xff0c;得到您想要的QQ账号登录效果图&#xff0c;用法简单&#xff0c;安全可靠&#xff0c;欢迎下载使用。 ----- 下载地址&am…