两个线程分别打印 1- 100,A 打印偶数, B打印奇数。

1. 直接用CAS中的AtomicInteger

package concurency.chapter13;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @auther draymonder
 */
public class PrintOddAndEven {
    public static volatile boolean flag = false;

    public static AtomicInteger num = new AtomicInteger();

    public static void main(String[] args) {
        new Thread(()->{
            while(num.get() < 100) {
                if(flag) {
                    System.out.println(Thread.currentThread() +  " " + num.getAndIncrement());
                    flag = false;
                }
            }

        }, "奇数").start();

        new Thread(()->{
            while(num.get() < 100) {
                if(!flag) {
                    System.out.println(Thread.currentThread() + " " + num.getAndIncrement());
                    flag = true;
                }
            }
        }, "偶数").start();
    }
}

第二种 带锁版

注意 奇数是 < 100 偶数是<=100

package concurency.chapter13;

/**
 * @auther draymonder
 */
public class Print2 {
    // flag = 0 now odd   flag = 1 now even
    public static volatile boolean flag = true;
    public static final Object lock = new Object();
    public static volatile int num = 0;

    public static void main(String[] args) {
        new Thread(()->{
            while(num < 100) {
                synchronized (lock) {
                    if (flag) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread() + " " + num++);
                    flag = true;
                    lock.notifyAll();
                }
            }
        },"奇数").start();
        new Thread(()->{
            while(num <= 100) {
                synchronized (lock) {
                    if (!flag) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread() + " " + num++);
                    flag = false;
                    lock.notifyAll();
                }
            }
        },"偶数").start();
    }
}

原文地址:https://www.cnblogs.com/Draymonder/p/10562488.html

时间: 2024-10-31 17:24:52

两个线程分别打印 1- 100,A 打印偶数, B打印奇数。的相关文章

//打印iOS 100次 并且后面跟着打印的次数 当次数为4的倍数的时候 //省略次数,只打印iOS

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { int i = 1 ; while(i < 101){ printf("iOS"); if(0 == i % 4){ i++; continue; } printf("%d\n",i); i++; } return 0; }

实现两个线程从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(()

Java多线程通信之两个线程分别打印AB各10次

一道经典的面试题目:两个线程,分别打印AB,其中线程A打印A,线程B打印B,各打印10次,使之出现ABABABABA.. 的效果 1 package com.shangshe.path; 2 3 public class ThreadAB { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 10 final Print business = new Print(); 11 12 new Threa

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 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_

设计四个线程,其中共两个线程每次对j增加1,另外两个线程每次对j减少1。循环100次,写出程序。

package cn.usst.DataTest6; /** * 设计四个线程,其中共两个线程每次对j增加1,另外两个线程每次对j减少1.循环100次,写出程序. * @ * */ public class DataTest6 { private int j; public static void main(String[] args) { DataTest6 dt = new DataTest6(); Inc inc = dt.new Inc(); Dec dec = dt.new Dec()

设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1。循环100次,写出程序。

package cn.usst.DataTest6; /** * 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1.循环100次,写出程序. * @ * */ public class DataTest6 { private int j; public static void main(String[] args) { DataTest6 dt = new DataTest6(); Inc inc = dt.new Inc(); Dec dec = dt.new Dec()

头条面试题之实现两个线程轮流打印字符串

在面试头条的时候,有一个很有意思的题目,利用两个线程交替打印一个字符串,这里主要就是对多线程中wait/notify的应用,特此记录. 对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify() Wakes up a single thread that is waiting on this object’s monitor. 译:唤醒在此对象监视器上等待的单个线程 void notifyAll() Wakes up all t

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

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

写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z

题目: 写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z.要求用线程间的通信. /** * 写两个线程,第一个线程打印1-52,第二个线程打印A-Z,打印结果为12A34B...5152Z */public class ThreadPrinter { // true打印数字,false打印字母 private boolean flag = true; // 打印字母 public synchronized void printNumber

两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?

3.两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的? void foo(){    ++a;    printf("%d ",a);}A.3 2    B.2 3    C.3 3    D.2 2  1.读a            5.读a2.a+1            6.a+13.写a            7.写a4.打印a          8.打印a B:12345678C:12356784(或48)D:15234678