[Java并发]实现两个线程交替打印奇偶数(volatile+yield实现)
解题思路
实现一个类OddEven
- 有一个打印奇数的方法,有一个打印偶数的方法。
- 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印。
- 方法中打印每个数前首先判断volatile变量的状态,不该自己打印就使用Thread.yield()让出CPU,该自己就打印并调换状态。
在主函数中,两个线程共享一个OddEven实例,并调用打印奇数的方法或打印偶数的方法。
本质是线程的协作。
代码
class OddEven {
int n;
boolean flag = true;// flag为true则打印奇数,否则打印偶数
public OddEven(int n) {
this.n = n;
}
public void printOdd() {
for (int i = 1; i <= n; i = i + 2) {
while (!flag) {// 注意此判断在for循环里面,因为每次输出都要判断是否是该本线程输出
Thread.yield();
}
System.out.println(i);
flag = false;
}
}
public void printEven() {
for (int i = 2; i <= n; i = i + 2) {
while (flag) {
Thread.yield();
}
System.out.println(i);
flag = true;
}
}
}
public class OddAndEven {
public static void main(String args[]) {
int n = 10;
OddEven eddEven = new OddEven(n);
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
eddEven.printEven();
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
eddEven.printOdd();
}
});
threadA.start();
threadB.start();
}
}
[Java并发]实现两个线程交替打印奇偶数(volatile+yield实现)的更多相关文章
- 使用Java线程并发库实现两个线程交替打印的线程题
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...
- 多线程下,两个线程交替打印0 -100,使用wait()和notify()
多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = ne ...
- Java两个线程实现交替运行-以交替打印奇偶数为例
本文旨在两个线程交替运行,不多哔哔直接看代码吧 public class Work2 { static final Object object = new Object(); public stati ...
- 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
前言 楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多.大部分同学都会使用 synchronized 来实现.楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄! 第一种 sy ...
- 两个线程交替打印奇偶数【Lock版】
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...
- A、B两个线程交替打印1 -- 100
方案一:import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.u ...
- Java 实现多线程切换等待唤醒交替打印奇偶数
引言 在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在java编程中,同样也会出现类似的情况,多个线程干同样一个活儿,比如火车站买票系统不能多个人买一到的是同一张票,当某个窗口(线程)在卖 ...
- Java并发 两个线程交替执行和死锁
今天看到一个题:两个线程交替打印奇数和偶数,即一个线程打印奇数,另一个打印偶数,交替打印从1到100.想了下有多重实现方法. wait和notify方法: public class OddEven { ...
- 使用Java实现三个线程交替打印0-74
使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...
随机推荐
- Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?
为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行.在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容. 模板 ...
- Linux与Windows的区别(后面了解后继续更新)
1.转自知乎上的@Haoyuan Xing得答案: Linux是一个以开发者为中心的操作系统,Windows是以消费者为中心的操作系统.这是最根本的区别,也是Linux相对于Windows的优势/劣势 ...
- java+opencv人脸识别程序2.0
由于第一次写的太粗糙了,所以又修改了一下,详细的更改如下: @ 目录 更改 窗口问题 识别问题 相似度对比 仍然存在的问题 人脸信息显示 图片质量 更改 优化了一下界面风格 窗口问题 原来是在主界面外 ...
- leetcode刷题记录——哈希表
1.两数之和 可以先对数组进行排序,然后使用双指针方法或者二分查找方法.这样做的时间复杂度为 O(NlogN),空间复杂度为 O(1). 用 HashMap 存储数组元素和索引的映射,在访问到 num ...
- adb命令将抓包工具证书从用户目录移动至系统目录,解决反爬对于本地证书认证
代码和注释 adb shell #连接手机进入shell模式 #su root #如果你不root权限可以试着这个一般都是root cd /data/misc/user/0/cacerts-added ...
- Mybatis入门(二)------增删改查
Mybatis增删改查基本操作 一.XML实现方式 1.mapper.xml的配置 <?xml version="1.0" encoding="UTF-8" ...
- A neural reinforcement learning model for tasks with unknown time delays
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 我们提出了一个基于生物学的神经模型,能够在复杂的任务中执行强化学习.该模型的独特之处在于,它能够在一个动作.状态转换和奖 ...
- latex:公式中的文字
公式环境中的说明文字应置于\mbox命令中.如果已经调用了数学工具宏包或者公式宏包,可改为选用一下3条功能更强的文本命令将简短文字插入公式中. \intertext{文本} 由amsmath宏包提供, ...
- VMDNAMD命令规则(转载)
输出体系的整个带电量:measure sumweights $all weight charge 给PDB文件设置周期边界条件:pbc set {54 54 24 } -all 将此晶胞内原子脱除周期 ...
- javascript 数据结构与算法---二叉数
二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...