package cn.shenzhen.feixun;

public class PrintABC extends Thread{

private String name;

private Object prev;

private Object self;

public PrintABC(String name,Object prev,Object self){

this.name=name;

this.prev=prev;

this.self=self;

}

/**

* ,为了控制执行的顺序,必须要先持有prev锁,

* 也就是前一个线程要释放自身对象锁,再去申请自身对象锁,两者兼备时打印字母,

* 之后首先调用self.notify()释放自身对象锁,唤醒下一个等待线程,

* 再调用prev.wait()释放prev对象锁,终止当前线程,等待循环结束后再次被唤醒。

* 程序运行的主要过程就是A线程最先运行,持有C,A对象锁,后释放A,C锁,唤醒B。

* 线程B等待A锁,再申请B锁,后打印B,再释放B,A锁,唤醒C,线程C等待B锁,再申请C锁,

* 后打印C,再释放C,B锁,唤醒A……

*/

public void run(){

int count=0;

while(count<10){

// 先获取 prev锁 如此问题中先将对象C锁住

synchronized (prev) {

//然后获取自身的锁如此问题中将对象A锁住

synchronized (self) {

System.out.print(name+"");

count++;

self.notify();//此问题中一共有三个对象ABC此时将self唤醒,是其他线程来竞争self

}

try {

prev.wait();

/**

* 注意的是notify()调用后,并不是马上就释放对象锁,

* 而是在相应的synchronized(){}语句块执行结束,自动释放锁,

* JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。

*/

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) throws InterruptedException {

Object a=new Object();

Object b=new Object();

Object c=new Object();

PrintABC printA=new PrintABC("A", c, a);//第一个线程先将AC对象锁住,A执行完了之后释放锁

PrintABC printB=new PrintABC("B", a, b);

PrintABC printC=new PrintABC("C", b, c);

/**

* 为了避免JVM启动ThreadA、ThreadB、ThreadC三个线程顺序的不确定性。

* 需要让A,B,C三个线程以确定的顺序启动,中间加一段sleep确保前一个线程已启动。

*/

printA.start();

/**

* sleep()方法导致了当前线程暂停执行指定的时间,

* 让出cpu该其他线程,但是他的监控状态依然保持者,

* 当指定的时间到了又会自动恢复运行状态。

*/

printA.sleep(10);

printB.start();

printB.sleep(10);

printC.start();

printC.sleep(10);

}

}

斐讯面试记录—阻塞Socket和非阻塞Socket

文章出自:http://blog.csdn.net/VCSockets/ 1.TCP中的阻塞Socket和非阻塞Socket 阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式. 阻塞的意思 ...

斐讯面试记录—TCP滑动窗口及拥塞控制

TCP协议作为一个可靠的面向流的传输协议,其可靠性是由流量控制和滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 一.滑动窗口协议 1. “窗口”对应的是一段可以被发送者发送的字节序 ...

使用Java实现三个线程交替打印0-74

使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...

三个线程ABC,交替打印ABC

转载与:https://www.cnblogs.com/x_wukong/p/4009709.html 创建3个线程,让其交替打印ABC . 输出如下:  ABCABCABCABC. 方法:使用syn ...

使用Java线程并发库实现两个线程交替打印的线程题

背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

多线程下,两个线程交替打印0 -100,使用wait&lpar;&rpar;和notify&lpar;&rpar;

多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = ne ...

多线程面试题之【三线程按顺序交替打印ABC的方法】

建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...

java实现线程交替打印1-52和A-Z

题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 实现思路:通过锁(s ...

Thread--两线程交替打印

package t3.copy; public class ThreadA extends Thread { private Object lock; public ThreadA(Object lo ...

随机推荐

GitHub Windows客户端无法登录

Windows 7系统,下载GitHub后始终无法登录,貌似填写的用户名和密码都没有提交服务器,直接客户端“验证”的. 解决办法: 下载 Microsoft .NET Framework 4.5 安装 ...

Android Studio的简单设置:

4.关闭更新: 如下图所示: 6.添加api文档悬浮提示: AS默认是没有api文档悬浮提示的,只有按住[Ctrl+Q]太会出现提示.如果要添加api的自动悬浮提示,设置如下: 上图中,在红框部分打钩 ...

Redis应用配置项说明

近期整理了下项目中Redis配置参数,以便学习备用~ #指定内存大小,格式为1k 1GB 1M,单位不区分大小写 # 1k  => 1000 bytes # 1kb => 1024 byt ...

Weinre调试移动端页面

Weinre是什么 如果我们做的是Cordova(phonegap)或其他hybird应用,当使用到原生功能时候(类似原生请求数据或页面切换时),没办法在PC chrome浏览器调试页面,一旦页面在手 ...

OCA读书笔记&lpar;16&rpar; - 执行数据库恢复

16. Performing Database Recovery 确定执行恢复的必要性访问不同接口(EM以及命令行)描述和使用可用选项,如RMAN和Data Recovery Advisor执行恢复- ...

hdu3570&comma; 超级简单的斜率优化dp

dp[i] = dp[j] + (a[i] - a[j])^2 + m;展开得 dp[i] = min{dp[j] + a[i]^2 + a[j]^2 - 2*a[i]*a[j] + m}其中a[i] ...

POJ 2329 &lpar;暴力&plus;搜索bfs)

Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 De ...

阶乘运算——ACM

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

UIDebuggingInformationOverlay在OC语法中使用

转载请注明出处:http://www.cnblogs.com/pretty-guy/p/6924882.html 你可以从这里下载demo 在微博看到几位大牛再说将UIDebuggingInforma ...

Python3 OS 文件&sol;目录方法

os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作 ...

斐讯c 语言面试题,斐讯面试记录—三线程交替打印ABC相关推荐

  1. 手撕面试题:多个线程交替打印问题

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到 ...

  2. 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

    作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...

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

    前提 今天下班时候和同事聊天偶然听到面试题"两个线程交替打印奇数和偶数"的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视 ...

  4. 华为C语言面试题集 C语言面试题-华为C语言面试题 深圳华为面试

    C语言面试题  1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量, ...

  5. 腾讯新闻php面试题,腾讯PHP面试题及参考答案

    1. 请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进行类比说明 ereg preg_match ereg_replace preg_replace 2. 请说明在php.ini中saf ...

  6. 神州数码c语言笔试题,神州数码 面试

    神州数码 面试 神州数码 面试1 今天去神州数码终面了.遇到了很多研究生,我就一个小本科,那个压力够大的. 废话不多说,神州数码(下面简称:神码), 神码的面试环节一共有三个,第一就是笔试了,笔试内容 ...

  7. c语言两个线程交替打印奇数和偶数,经典面试题——两个线程交替打印奇数和偶数...

    今天在和同事讨论线程说到了这个我就实现了一把 直接贴代码 public class Demo2 { private static volatile int i = 1; public static v ...

  8. lock交替打印_面试题Synchronized实现两个线程交替打印

    线程之间的通信有很多种方式,使用Synchronized实现两个线程的交替打印,主要是利用Object对象的wait.notify方法,下面来看下代码: 解释一下上面的程序,首先定义一个内部类,实现s ...

  9. c语言利用线程交替打印奇偶数,两个线程交替打印奇偶数

    序言 以前看过多线程交替打印奇偶数,知道大概怎么写,实际写的时候会卡住,特此记录下来 方法一:wait, notify,性能较差,不推荐使用 public class TestThread { pub ...

  10. 多线程面试题之【三线程按顺序交替打印ABC的方法】

    建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...

最新文章

  1. sql isnull函数的使用(转载)
  2. 李德毅获吴文俊人工智能最高成就奖 | AI日报
  3. ubuntu php mysql5.6_Ubuntu 安装 Mysql 5.6 数据库
  4. vue 一个组件内多个弹窗_论如何用Vue实现一个弹窗-一个简单的组件实现
  5. python语言的核心理念是_学习Python语言四大核心优势
  6. NServiceBus主机
  7. 清华计算机系教学计划,清华大学电子信息科学与技术教学计划
  8. Visio怎么删掉已有部分图形
  9. 内置googletts并且内置中文语音包
  10. high sierra php,關於macOS High Sierra 10.13 中,XAMPP php7 安裝memcache的問題
  11. 2022年淘宝女王节预售活动时间介绍
  12. 韩信点兵python程序_韩信点兵计算公式与代码
  13. 2019 原创技术干货整理
  14. C语言读取mp3文件的信息
  15. 基于关系数据库彩票投注模拟系统设计与实现
  16. 实战APP微信支付服务商模式(一个APP多个商户收款)
  17. python输入两个列表a和b、利用内置函数zip()_2nd Python基础语法
  18. 基于肤色模型和形态学处理的人脸检测算法matlab仿真
  19. Ubuntu16.10 Houdini16.0安装
  20. springboot入门视频教程百度网盘下载

热门文章

  1. 第一集 斗罗世界 第六章
  2. 计算机上没有端口DOT4,dot4_001端口
  3. 编写一个Linux虚拟网卡来实现类NVI
  4. 中图分类法----O 数理科学和化学
  5. 常用报表开发工具介绍
  6. 从计算机内部提取型号和mac,Mac计算机型号这么多 我该选哪一个?
  7. 数据结构与算法——30. 广度、深度优先搜索及骑士周游问题
  8. 线性不可分转可分----低维空间转高维空间
  9. C++ 惯用法之 Nifty Counter
  10. Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2