当前位置: 首页 > 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;。…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...