当前位置:首页 > 后端开发 > java多线程:循环输出ABC

java多线程:循环输出ABC

7个月前 (05-21)33

java多线程的经典问题:
问题:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次。

首先写出测试类

public class Main {
      
    public static void main(String[] args) throws Exception{
        Object a=new Object();
        Object b=new Object();
        Object c=new Object();

        Mythread my1=new Mythread("A",c,a);
        Mythread my2=new Mythread("B",a,b);
        Mythread my3=new Mythread("C",b,c);

        Thread thread1=new Thread(my1);
        Thread thread2=new Thread(my2);
        Thread thread3=new Thread(my3);

        thread1.start();
        Thread.sleep(1000);
        thread2.start();
        Thread.sleep(1000);
        thread3.start();
        Thread.sleep(1000);
    }
}

其中a、b、c分别表示三个线程所对应的对象。
再写出实现Runnable接口的类

public class Mythread implements Runnable{
     
    private String name="";
    private Object pre;//用来表示上一个对象
    private Object now;//用来表示此次对象
    public Mythread(String name,Object pre,Object now){
        this.name=name;
        this.pre=pre;
        this.now=now;
    }
    @Override
    public void run(){
        int count=10;
        while(count>0){
            count--;
            synchronized(pre){
                synchronized(now){
                        System.out.println(name);
                        now.notify();//唤醒下一个线程
                }
                try {
                        pre.wait();
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
            }
        }
    }
}

结果; ABCABCABCABCABCABCABCABCABCABC

结果分析:有三个对象 a b c
1. 首先是在线程1 在执行结束后,由于执行了a.notify(),唤醒了线程2,再由于执行了c.wait(),使得线程1
处于等待,所以while只执行了一次,需要等待有人唤醒了c,才能继续执行。
2.然后由于是线程2被唤醒了,执行了b.notify(),唤醒了线程3,再由于执行了a.wait(),使得线程2
处于等待,所以while只执行了一次,需要等待有人唤醒了a,才能继续执行。
3..然后由于是线程3被唤醒了,执行了c.notify(),唤醒了线程1,再由于执行了b.wait(),使得线程3
处于等待,所以while只执行了一次,需要等待有人唤醒了b,才能继续执行。
需要注意的是:虽然在线程1中,执行了c.wait(),但却使得线程1处于等待的状态,并且由于wait释放了对象锁,使得在线程3中,能够获得c的对象锁(语句:synchronized(now))。

作者:yanghuiysz
来源链接:https://blog.csdn.net/qq_32655383/article/details/51660925

“java多线程:循环输出ABC” 的相关文章

java判断是否为空:java 判断对象是否为空

java判断是否为空:java 判断对象是否为空

java判断是否为空:java 判断对象是否为空 on 2009-2-12  in Java教程  |...

Java的多线程机制系列:(三)synchronized的同步原理

Java的多线程机制系列:(三)synchronized的同步原理

synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在...

java判断空字符串和对象是否为null

判断空字符串: StringUtils.isEmpty(str); 判断对象为null: Objects.isNull(object); 判断对...

Java进阶攻略:7大技能+12份进阶笔记+面试150题

Java进阶攻略:7大技能+12份进阶笔记+面试150题

​   以下都是阿里大牛韩飞龙推荐的主流技术,当你全部掌握上述的这些技术那么你就已经是P8级别,而且你也已经形成...

Java多线程之synchronized详解

Java多线程之synchronized详解

目录 synchronized简介 同步的原理 对象头与锁的实现 锁的优化与升级 Monitor Record 锁的对比...

Java 多线程(一) 基础知识与概念

Java 多线程(一) 基础知识与概念

Java多线程,基本概念,包括线程和进程的概念和区别,单线程与多线程的一些基础知识。 多线程Multi-Thread 基础   线程概念  ...

Java中几种常用设计模式

Java中几种常用设计模式

目录 Java中几种常用设计模式 一. 单例模式 二.工厂方法模式 三.抽象工厂模式...

Java 集合之List 集合的删除方法顺序分析以及remove和removeAll区别

Java 集合之List 集合的删除方法顺序分析以及remove和removeAll区别

在上一篇 《Java 集合之List 集合的添加方法顺序分析以及add和addAll区别》中已经分析过 对于List集合顺序从前到后的分析论证,这里将不再详细分析 r...

Java8  的lambda表达式到底需不需要对遍历的对象进行判空?

Java8 的lambda表达式到底需不需要对遍历的对象进行判空?

最近遇到一个问题,我一直以为Java8 lambda表达式foreach遍历的时候不需要进行判空, 直到我遇到了一个bug: 我觉得还是有必要判...

Java多线程(二)线程的三种实现方式

Java多线程(二)线程的三种实现方式

一、继承Tread类 实现方式: 继承Tread类 重写run方法 创建实例调用start()方法 实现...