博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程调度之多线程循环打印ABCABC
阅读量:5956 次
发布时间:2019-06-19

本文共 1728 字,大约阅读时间需要 5 分钟。

参考:

但是我有点看不明白,于是就自己改写了下,后面分析。

线程类:

package threadabc;public class ThreadPrint implements Runnable {  //A    private Object after;  // Object b 下一个要执行的对象锁    private Object now;    //Object a 当前对象锁    private String name;    public ThreadPrint(String name, Object after, Object now) {        this.name = name;        this.now = now;        this.after = after;    }    @Override    public void run() {       for (int i=0;i<100;i++){           System.out.println(name);   //A           synchronized (now) {                   synchronized (after) {                       after.notify();   //B                   }               try {                   now.wait();      //线程A放入a锁               } catch (InterruptedException e) {                   e.printStackTrace();               }           }       }    }}

Main主函数:

public static void main(String[] args) {        Object a = new Object();        Object b = new Object();        Object c = new Object();        ThreadPrint threadPrintA = new ThreadPrint("A",b,a);        ThreadPrint threadPrintB = new ThreadPrint("B",c,b);        ThreadPrint threadPrintC = new ThreadPrint("C",a,c);        Thread threadA = new Thread(threadPrintA);        Thread threadB = new Thread(threadPrintB);        Thread threadC = new Thread(threadPrintC);            threadA.start();            threadA.sleep(100);            threadB.start();            threadB.sleep(100);            threadC.start();    }

关键:

a对象锁对应A线程b对象锁对应B线程c对象锁对应C线程

流程:

1. 执行A线程:
a对象,b对象传入A线程
当A线程执行完成后,将A线程关入a对象锁中,并且从b对象锁中唤醒B线程,因为b锁中还没有B线程所以没用。

  1. 因为按照主线程顺序,接下来执行线程B
    b对象,c对象传入A线程

当B线程执行完成后,将B线程关入b对象锁中,并且从c对象锁中唤醒C线程,因为c对象锁中还没有C线程所以没用。

  1. 因为按照主线程顺序,接下来执行线程C
    c对象,a对象传入A线程

当C线程执行完成后,将C线程关入c对象锁中,并且从a对象锁中唤醒A线程。此时只有A线程执行任务。

由此一个循环结束,开启重复循环

转载地址:http://birxx.baihongyu.com/

你可能感兴趣的文章
hibernate 执行存储过程 方法
查看>>
RapidIOIP核的验证方法研究_王玉欢
查看>>
崩溃日志的实例
查看>>
base64是啥原理
查看>>
实战 Windows Server 2012 群集共享卷
查看>>
CSS 元素超出部分滚动, 并隐藏滚动条
查看>>
React中那些纠结你的地方(一)
查看>>
Docker入门安装教程
查看>>
PhoneGap极光推送 cordova消息推送
查看>>
Subarray Sum Equals K
查看>>
preventDefault, stopPropagation, stopImmediatePropagation 三者的区别
查看>>
算法题解:找出包含给定字符的最小窗口(枚举的一般方法)
查看>>
超级账本HyperLedger初体验
查看>>
完美解决html中select的option不能隐藏的问题。
查看>>
推荐5大开源工具,用于开发Kubernetes项目
查看>>
制定2015年的移动开发策略
查看>>
JPA 2.2改进了易用性
查看>>
从蚂蚁金服实践入手,带你深入了解 Service Mesh
查看>>
24周年,“常青树”Delphi发布新版本10.3.1
查看>>
7. 从数据库获取数据- 从零开始学Laravel
查看>>