java多线程:循环输出ABC
来源:互联网 发布:倒班表软件 编辑:程序博客网 时间:2024/06/06 13:16
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))。
0 0
- java 多线程循环输出ABC
- java多线程:循环输出ABC
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程 循环打印ABC 10次
- JAVA多线程同步,有序输出ABC
- 多线程循环打印ABC
- 循环输出10次ABC
- ReentrantLock实现abc循环输出
- java多线程顺序执行并顺序输出ABC问题
- JAVA多线程打印ABC
- Java循环打印ABC…
- c++多线程实现循环打印ABC
- 控制线程顺序循环输出ABC (java Condition 代码简洁版)
- java多线程顺序打印ABC
- JAVA 多线程轮流打印ABC
- JSON的基础知识
- RMAN restore恢复带有OFFLINE文件的数据库
- Scrapy Selector 语法
- leetcode经典解法
- python多重继承 MRO
- java多线程:循环输出ABC
- 深入理解java范型
- Swift UIButton、UILabel、UITextField的创建与用法
- LeetCode-258 Add Digits
- Android开发笔记之音乐播放器
- java缓存ehcache和memcache区别
- STL之list容器详解
- java compiler level does not match解决方法
- 剑指offer27--查找数组中最小的k个数