当前位置: 首页 > news >正文

java八股文面试[多线程]——两个线程交替打印1-100之间的数字

一份代码,两个线程,使用synchronize实现:
  • 重写run()方法,将输出1到100之间整数的代码写到同步方法里。
  • 线程1进入到同步方法,输出一个整数后,阻塞并释放锁。
  • 线程2进入到同步方法,唤醒线程1,输出整数后,阻塞并释放锁。
  • 线程1和线程2重复第3步,直到输出所有的整数。
public class PrintNumThread extends Thread {static int num = 0;static Object object = new Object();@Overridepublic void run() {while (true) {synchronized (object) {//唤醒等待的线程 必须在同步代码块中object.notify();if (num < 100) {num++;System.out.println(Thread.currentThread().getName()+":"+num);} else {break;}try {/*wait()  必须在同步代码块中使用,必须是使用同步锁调用wait()wait()调用后,锁会释放必须要通过其他线程来唤醒*/object.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {PrintNumThread p1 = new PrintNumThread();PrintNumThread p2 = new PrintNumThread();p1.start();p2.start();}
}

两个不同的线程:

不使用锁,利用volatile实现

定义一个static的flag,交替修改0 1 ,

//两个线程,一个打印奇数,一个打印偶数
public class OneToHundred{static volatile int flag = 0;public static void main(String[] args){new Thread(new Task1(),"A").start();new Thread(new Task2(),"B").start();}
}class Task1 implements Runnable{@Overridepublic void run(){int i = -2;while(i<=99){if(OneToHundred.flag == 0){i+=2;System.out.println("a:" + i);OneToHundred.flag = 1;}}}
}class Task2 implements Runnable{@Overridepublic void run(){int i = -1;while(i<=98){if(OneToHundred.flag == 1){i+=2;System.out.println("b:" + i);OneToHundred.flag = 0;}}}
}
使用ReentranLock(固定一个打印奇数,一个打印偶数)
//三实现的方式,虽然也是一个打印奇数,一个打印偶数,但是A打印奇数还是偶数是随机的,即A打印奇数,则B打印偶
//如果A随机打印的是偶数,那么B打印奇数
//现在固定,A就是打印奇数,B就是打印偶数
public class OneToHundred {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread( new Task(1),"A");Thread t2 = new Thread( new Task(0),"B");t1.start();t2.start();}
}class Task implements Runnable{private static int number = 0;private int flag = 0;private static ReentrantLock lock = new ReentrantLock();private static Condition condition = lock.newCondition();Task(int flag){this.flag = flag;}@Overridepublic void run(){while(number < 100){lock.lock();if(number >=100) break;if(b % 2 == this.flag){flag++;}else{try{condition.await();}catch (InterruptedException e) {e.printStackTrace();} }condition.signalAll();lock.unlock();}}
}

在Condition对象中,与wait() ,notify() ,notifyAll()方法分别对应的是await() , signal() ,signalAll()方法。Condition实例实质上被绑定到一个锁上要为特定Lock实例获得Condition实例,使用其newCondition()方法。
将第一个Number类改成以下代码,也可以实现一样的结果。
 

知识来源:

两个线程交替打印1-100之间的数字_线程交替打印1到100_叫我剑锋的博客-CSDN博客

两个线程交替打印1-100_两个线程交替打印1到100_一 路的博客-CSDN博客

两个线程交替打印1-100_两个线程交替打印1到100_一 路的博客-CSDN博客

相关文章:

java八股文面试[多线程]——两个线程交替打印1-100之间的数字

一份代码&#xff0c;两个线程&#xff0c;使用synchronize实现&#xff1a; 重写run()方法&#xff0c;将输出1到100之间整数的代码写到同步方法里。线程1进入到同步方法&#xff0c;输出一个整数后&#xff0c;阻塞并释放锁。线程2进入到同步方法&#xff0c;唤醒线程1&…...

gRPC之gRPC认证

1、gRPC认证 前面篇章的gRPC都是明文传输的&#xff0c;容易被篡改数据&#xff0c;本章将介绍如何为gRPC添加安全机制。 gRPC默认内置了两种认证方式&#xff1a; SSL/TLS认证方式 基于Token的认证方式 同时&#xff0c;gRPC提供了接口用于扩展自定义认证方式。 1.1 TLS…...

简易虚拟培训系统-UI控件的应用3

目录 Button组件的组成 Button组件方法1-在Button组件中设置OnClick()回调 Button组件方法2-在脚本中添加Button类的监听 上一篇使用了文件流读取硬盘数据并显示在Text组件中&#xff0c;本篇增加使用按钮来控制显示哪一篇文字信息。 Button组件的组成 1. 新建Button&#…...

语言模型(language model)

文章目录 引言1. 什么是语言模型2. 语言模型的主要用途2.1 言模型-语音识别2.2 语言模型-手写识别2.3 语言模型-输入法 3. 语言模型的分类4. N-gram语言模型4.1 N-gram语言模型-平滑方法4.2 ngram代码4.3 语言模型的评价指标4.4 两类语言模型的对比 5. 神经网络语言模型6. 语言…...

【3.Vue子组件调用父组件方法】

1.概述 使用组件建抛出事件的方式来调用父组件的方法&#xff0c;不直接用this.$parent.function的方法&#xff0c;当然这种方式是可以的。 2.代码实现 2.1 父组件代码 父组件写一个方法给子组件调用 // 设备点击事件// equipId:设备id// leftValue:left值// topValue:top…...

算法系列-876-求链表的中间节点

求链表中间节点&#xff0c;如果有两个中间节点取后面那个 链表定义 // lc codestart /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(…...

h5 ws 客户端 监听ws服务器广播的信息

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>AI智能写作</title><!-- Bootstrap CSS --><meta charset"utf-8"><meta name"viewport" content"widt…...

网络基础之重中之重

目录 IP协议 ​编辑 基本概念&#xff1a; 协议头格式&#xff1a; ​编辑 网段划分 DHCP &#xff1a; CIDR&#xff1a; 特殊的IP地址&#xff1a; IP地址的数量限制&#xff1a; 私有IP和公网IP 路由 路由的过程&#xff1a; 数据链路层 认识以太网&#x…...

HarmonyOS应用开发者-----基础认证试题及答案

HarmonyOS应用开发者基础认证试题及答案 试题会不定时刷新,本试题仅供大家学习参考 【判断题】 2.5/2.5 所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。 正确(True)错误(False) 回答正确【判断题】 2.5/2.5 在Column和Row容器组…...

C++:string并非以0作为结束符,c_str和data的返回却包含结束符0

C语言中使用char数组保存字符串时,是以字符为0或者\0作为字符串的结束符标志的。 所以一个char str[10]的数组只能合法的保存9个字符(因为最后还要加一个结束符)。 #include <cstring> #include <iostream>using namespace std;int main() {char str[10] ="…...

ChatGPT插件的优缺点

虽然西弗吉尼亚大学的研究人员看到了最新的官方ChatGPT插件——名为“代码解释器”&#xff08; Code Interpreter&#xff09;的教育应用潜力&#xff0c;但他们也发现&#xff0c;对于使用计算方法处理针对癌症和遗传疾病的定向治疗的生物数据的科学家来说&#xff0c;这款插…...

北京985学校,交叉学科考英一数三408

北京师范大学(B) 考研难度&#xff08;☆☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1096字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 北…...

ChatGPT 总结前端HTML, JS, Echarts都包含哪些内容

AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu...

企业架构LNMP学习笔记1

项目开发流程&#xff1a; 公司老板或者产品经理&#xff0c;根据市场调查&#xff0c;决定开发一整套互联网产品。 互动社交电商用户论坛&#xff08;BBS&#xff09; 产品决策 &#xff08;老板产品UI设计&#xff09; 业务实施、代码开发 程序开发人员 前端开发&#x…...

【位运算】leetcode371:两整数之和

一.题目描述 两整数之和 二.思路分析 题目要求我们实现两整数相加&#xff0c;但是不能使用加号&#xff0c;应该立马想到是用位运算来解决问题。之前说过&#xff0c;异或就是“无进位相加”&#xff0c;故本题可以先将两数异或&#xff0c;然后想办法让得到的结果进位即可。…...

【爬虫小知识】如何利用爬虫爬网页——python爬虫

前言 网络时代的到来&#xff0c;给我们提供了海量的信息资源&#xff0c;但是&#xff0c;想要获取这些信息&#xff0c;手动一个一个网页进行查找&#xff0c;无疑是一项繁琐且效率低下的工作。这时&#xff0c;爬虫技术的出现&#xff0c;为我们提供了一种高效的方式去获取…...

什么是跨域问题 ?Spring MVC 如何解决跨域问题 ?Spring Boot 如何解决跨域问题 ?

目录 1. 什么是跨域问题 &#xff1f; 2. Spring MVC 如何解决跨域问题 &#xff1f; 3. Spring Boot 如何解决跨域问题 &#xff1f; 1. 什么是跨域问题 &#xff1f; 跨域问题指的是不同站点之间&#xff0c;使用 ajax 无法相互调用的问题。 跨域问题的 3 种情况&#x…...

线性代数的学习和整理17:向量空间的基,自然基,基变换等(未完成)

目录 3 向量空间的基&#xff1a;矩阵的基础/轴 3.1 从颜色RGB说起 3.2 附属知识 3.3 什么样的向量可以做基&#xff1f; 3.4 基的分类 3.1.1 不同空间的基---向量组的数量可能不同 3.1.2 自然基 3.1.3 正交基 3.1.4 标准正交基 3.1.5 基和向量/矩阵 3.1.6 基变换 …...

Java中支持分库分表的框架/组件/中间件简介

文章目录 1 sharding-jdbc2 TSharding3 Atlas4 Cobar5 MyCAT6 TDDL7 Vitess 列举一些比较常见的&#xff0c;简单介绍一下&#xff1a; sharding-jdbc&#xff08;当当&#xff09; TSharding&#xff08;蘑菇街&#xff09; Atlas&#xff08;奇虎360&#xff09; Cobar&#…...

7.2 项目2 学生通讯录管理:文本文件增删改查(C 版本)(自顶向下设计+断点调试) (A)

C自学精简教程 目录(必读) 该作业是 作业 学生通讯录管理&#xff1a;文本文件增删改查&#xff08;C版本&#xff09; 的C 语言版本。 具体的作业题目描述&#xff0c;要求&#xff0c;可以参考 学生通讯录管理&#xff1a;文本文件增删改查&#xff08;C版本&#xff09;。…...

NoFences:免费开源的Windows桌面整理终极方案,告别杂乱桌面

NoFences&#xff1a;免费开源的Windows桌面整理终极方案&#xff0c;告别杂乱桌面 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上杂乱无章的图标而烦恼…...

CANN Profiling 与性能分析:定位训练与推理瓶颈

一、为什么需要 Profiling 1.1 性能问题的来源 深度学习训练和推理的性能瓶颈可能来自多个环节&#xff1a;数据准备慢导致 GPU 空闲、模型算子计算慢成为瓶颈、内存拷贝频繁拖累整体、通信带宽受限拖慢分布式训练。不同瓶颈的优化方法完全不同&#xff0c;错误的优化方向不仅浪…...

如何在浏览器中零安装查看SQLite数据库?完全指南

如何在浏览器中零安装查看SQLite数据库&#xff1f;完全指南 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 你是否曾遇到过这样的情况&#xff1a;收到一个SQLite数据库文件需要快速查看&#xf…...

三周、1.81倍、百亿:中国AI的压制性时刻

调用量飙升、百亿美元涌入、智能体密集落地——过去七天&#xff0c;中国AI正在改写全球游戏规则。与此同时&#xff0c;内容创作者的“AI红利窗口”也正在打开。连续三周&#xff0c;中国AI压住美国5月18日&#xff0c;OpenRouter最新数据显示&#xff0c;5月11日至17日当周&a…...

2026年最新亲测3款生成会议纪要免费工具推荐,10分钟出稿非常好用!

兄弟们&#xff0c;我来了。作为一个天天泡在会议室、钉钉和飞书里来回切换的职场老兵&#xff0c;我太懂“开会一时爽&#xff0c;整理火葬场”的痛苦了。这几年&#xff0c;各种AI录音转文字、语音转写工具层出不穷&#xff0c;但真正能打、能免费白嫖、还不乱收费的&#xf…...

终极指南:使用Python脚本突破百度网盘限速壁垒

终极指南&#xff1a;使用Python脚本突破百度网盘限速壁垒 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在云存储服务日益普及的今天&#xff0c;百度网盘凭借其庞大的用户基…...

2026最新测评:4款海外降英文文本AIGC工具实测

我用GPT写了一篇英文技术报告&#xff0c;然后分别扔进4个降AI工具。结果出乎意料。如果你经常用ChatGPT、Claude或Gemini写英文内容——无论是论文摘要、技术文档、公司报告还是博客文章——你一定遇到过这个尴尬&#xff1a;明明内容是自己构思、自己修改的&#xff0c;但Tur…...

CW-DAPLINK调试器开箱体验:从拆包到点亮第一个LED灯的全过程

CW-DAPLINK调试器开箱体验&#xff1a;从拆包到点亮第一个LED灯的全过程 拆开快递包装的那一刻&#xff0c;看到印有CW-DAPLINK字样的白色小盒子&#xff0c;作为嵌入式开发新手的我既兴奋又忐忑。这款由武汉芯源半导体推出的调试工具&#xff0c;将成为我探索CW32系列MCU世界的…...

零极点分析:从系统稳定性到滤波器设计的核心工程工具

1. 项目概述&#xff1a;从“系统行为”的根源说起在信号处理、控制理论乃至电路设计的日常工作中&#xff0c;我们常常需要面对一个核心问题&#xff1a;如何预测、分析和设计一个系统的动态行为&#xff1f;无论是设计一个能稳定跟踪目标的控制器&#xff0c;还是优化一个音频…...

瑞芯微RK3568音频调试实战:从procfs到i2cset,手把手教你排查I2S无声问题

RK3568音频调试实战&#xff1a;从无声到有声的完整排查指南 当你在RK3568平台上遇到音频输出无声的问题时&#xff0c;那种挫败感是每个嵌入式工程师都深有体会的。本文将以一个真实的调试案例为线索&#xff0c;带你走完从问题定位到最终解决的完整流程&#xff0c;而不仅仅是…...