交替打印出奇数和偶数

两个线程如何交替打印出奇数和偶数

分析

两个线程交替打印奇数和偶数,最关键的是如何协作的问题。

  • 打印的数可以用java里面的atomicInteger 来保证原子性;
  • 打印何时结束需要设置一个上限,比如打印到100结束;
 1 public class PrintABAtomic{
 2     private static final int MAX_PRINT_NUM = 100;
 3     private static final AtomicInteger atomicInteger = new AtomicInteger(0);
 4
 5     public void printAB(){
 6         new Thread(() -> {
 7             while (atomicInteger.get() < MAX_PRINT_NUM){
 8                 //打印奇数
 9                 if(atomicInteger.get() % 2 == 0){
10                     //log.info("num:" + atomicInteger.get());
11                     System.out.println("num:" + atomicInteger.get());
12                     atomicInteger.incrementAndGet();
13                 }
14             }
15         }).start();
16
17         new Thread(() -> {
18             while (atomicInteger.get() < MAX_PRINT_NUM) {
19                 // 打印偶数.
20                 if (atomicInteger.get() % 2 == 1) {
21                     //log.info("num:" + atomicInteger.get());
22                     System.out.println("num:" + atomicInteger.get());
23
24                     atomicInteger.incrementAndGet();
25                 }
26             }
27         }).start();
28     }

还可以采用另一种办法。用volatile 的方式来实现。

 1 public class PrintABVolatile {
 2     private static final int MAX_VALUE_NUM = 100;
 3     private static volatile int count = 0;
 4
 5
 6     public void printAB(){
 7         new Thread(() -> {
 8             while(count < MAX_VALUE_NUM){
 9                 if(count % 2 == 0){
10                     System.out.println("偶数线程num" + count);
11                     count++;
12                 }
13             }
14         }).start();
15         new Thread(() -> {
16             while(count < MAX_VALUE_NUM){
17                 if(count % 2 == 1){
18                     System.out.println("奇数线程num" + count);
19                     count++;
20                 }
21             }
22         }).start();
23     }
24 }

直接用main方法调试

当然,这种方法仅用于调试,不能用于写单元测试。

1 public class TestRunner {
2     public static void main(String[] args) {
3         /*PrintABAtomic printABAtomic = new PrintABAtomic();
4         printABAtomic.printAB();*/
5         PrintABVolatile printABVolatile = new PrintABVolatile();
6         printABVolatile.printAB();
7     }
8 }

提供了两种方法,分别利用volatile的可见性和AtomicInteger 的原子性对两个线程进行协调。

原文地址:https://www.cnblogs.com/xujiangxi/p/12364734.html

时间: 2024-12-19 01:38:04

交替打印出奇数和偶数的相关文章

经典面试题——两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现. 场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现. 这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现:场景二是JDK1.5引入JUC包之后简化了并发编程的前提下的更简便的实现.下面针对两个场景做对应的实现. 场景一 场景一中,线程A和线程B交替打印奇数

经典笔试题:两个线程交替打印奇偶数

一.采用对象的wait() notify()方法实现 package com.gaopeng.programming; import java.util.concurrent.TimeUnit; /** * 经典笔试题:交替打印奇偶数 采用对象的wait() notify()方法实现 * * @author gaopeng * */ public class OddEvenThread { private static volatile Integer counter = 0; public s

c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化

请编写一个程序,实现对于给定的正整数N,依次打印出小于等于N的所有素数. 方法一:试除法 由素数的定义得到如下程序: #include<stdio.h> int print_prime(int num)//prime表示素数 { int i = 0; for (i = 2; i <= num; i++) { int j = 0; for (j = 2; j < i; j++) { if (i%j == 0) { break; } } if (i==j) { printf("

剑指Offer面试题:13.调整数组顺序使奇数位于偶数前面

一.题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 例如有以下一个整数数组:12345,经过调整后可以为:15342.13542.13524等等. 二.解题思路 2.1 基本解法 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位.挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位.由于每碰到一个

实现两个线程从0-100交替打印

分享一道多线程面试题,只是拿来练手的,这里通过两种方式去实现0-100交替打印,大家无聊的话,可以瞅两眼. 一.Synchronized实现: public class PrintNumberIncrInSynchronized { private static int number; private static final Object object = new Object(); public static void main(String[] args) { new Thread(()

【剑指offer】八,调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 分析:此题在oj上练习时多加了条件,即调整后的数字之间的顺序是不变的.目前只想到一种方法,后续有其他方法再做添加.新建一个数组,扫描原数组两遍,第一遍取出原数组中所有的奇数,存入新数组中.第二遍找出所有的偶数存入新数组中.代码实现如下: 1 public class Solution { 2 public void

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

【剑指Offer学习】【面试题14 :调整数组顺序使奇数位于偶数前面】

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位予数组的后半部分. 这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面.也就是说我们在扫描这个数组的时候, 如果发现有偶数出现在奇数的前面,我们可以交换它们的顺序,交换之后就符合要求了. 因此我们可以维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动:第二个指针初始化时指向数组的最后一个数字, 它只向前移动.在两个指针相遇之前,第一

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. 写了两个版本,一个是用了mutex,不用条件变量:另外一个是用条件变量. 第一个,不用条件变量 1 #include <stdio.h> 2 #include <string.h> 3 #include <pthread.h> 4 5 6 7 const int LOOP_