三个线程ABC,交替打印ABC
转载与:https://www.cnblogs.com/x_wukong/p/4009709.html
创建3个线程,让其交替打印ABC 。 输出如下: ABCABCABCABC。
方法:使用synchronized关键字和wait() 、notify()
主要的思想就是,为了控制执行的顺序,必须要先持有a锁,也就是前一个线程要释放自身对象锁,再去申请自身对象锁,两者兼备时打印字母,之后首先调用b.notify()释放自身对象锁,唤醒下一个等待线程,再调用a.wait()释放a对象锁,终止当前线程,等待循环结束后再次被唤醒。程序运行的主要过程就是A线程最先运行,持有C,A对象锁,后释放A,C锁,唤醒B。线程B等待A锁,再申请B锁,后打印B,再释放B,A锁,唤醒C,线程C等待B锁,再申请C锁,后打印C,再释放C,B锁,唤醒A……
为了防止线程A,B,C顺序启动,因此在启动a线程之后要让线程休眠,然后启动线程B,再启动线程C。
要注意的是notify()可以将下一个想要获得该锁的线程唤醒。wait()可以释放锁。
package threadforme;
public class ThreadWait extends Thread{
private String name;
private Object a;
private Object b;
public ThreadWait(String name,Object a,Object b) {
this.name=name;
this.a=a;
this.b=b;
}
public void run() {
int count=10;
while(count>0) {
synchronized(a) { //先获得a锁,进入临界区
synchronized(b) {
count--;
System.out.print(name);
b.notify(); //在完成打印之后,将b的阻塞线程唤醒
}
try {
a.wait(); //调用wait方法终止当前线程
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
package threadforme;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
Object a=new Object();
Object b=new Object();
Object c=new Object();
ThreadWait t1=new ThreadWait("A",c,a); //先获得C锁,然后对打印A的过程进行锁定,再释放A锁,再释放C锁
ThreadWait t2=new ThreadWait("B",a,b); //按照顺序获得A锁,获得B锁,打印B
ThreadWait t3=new ThreadWait("C",b,c);
t1.start();
Thread.sleep(20);
t2.start();
Thread.sleep(20);
t3.start();
}
}
package threadforme;
public class ThreadTest {public static void main(String[] args) throws InterruptedException {Object a=new Object();Object b=new Object();Object c=new Object();ThreadWait t1=new ThreadWait("A",c,a);//先获得C锁,然后对打印A的过程进行锁定,再释放A锁,再释放C锁ThreadWait t2=new ThreadWait("B",a,b);//按照顺序获得A锁,获得B锁,打印BThreadWait t3=new ThreadWait("C",b,c);t1.start();t2.start();t3.start();}
}
三个线程ABC,交替打印ABC的更多相关文章
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...
- 斐讯面试记录—三线程交替打印ABC
package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...
- 多线程面试题之【三线程按顺序交替打印ABC的方法】
建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...
- java三线程循环有序打印ABC
迅雷笔试题: 编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. 解决思路:每个线 ...
- python多线程交替打印abc以及线程池进程池的相关概念
import threading import sys import time def showa(): while True: lockc.acquire() #获取对方的锁,释放自己的锁 prin ...
- 线程轮循打印ABC...
package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurren ...
- Java多线程wait和notify协作,按序打印abc
有一个经典的多线程面试题:启三个线程,按序打印ABC 上代码: package cn.javaBase.study_thread1; class MyRunnable1 implements Runn ...
- Java多线程:用三个线程控制循环输出10次ABC
转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...
- Java线程同步打印ABC
需求: 三个线程,依次打印ABCABCABC.... 方案一: 使用阻塞队列,线程1从队列1获取内容打印,线程2从队列2获取内容打印,线程3从队列3中获取内容打印.线程1把B放到队列3中,线程2把C放 ...
随机推荐
- 【转】NHIBERNATE的各种保存方式的区别 (SAVE,PERSIST,UPDATE,SAVEORUPDTE,MERGE,FLUSH,LOCK)
前言 今天学学习NH这个框架,在新增对象的时候,看见大神用了persist而没有用Save,心中比较疑惑,查阅资料的时候,发现这篇写的非常不错,转载供大家参考. hibernate的保存hiberna ...
- mysql 修改数据类型
只修改列的数据类型的方法: 通常可以写成 alter table 表名 modify column 列名 新的列的类型 例如:student表中列sname的类型是char(20),现在要修改为var ...
- Dokcer-ce安装脚本
安装docker #!/bin/bash # coding: utf- # Copyright (c) set -e #返回值为0时,退出脚本 echo "1. 备份yum" { ...
- JavaScript document对象
1.document对象是window对象的子对象,可直接使用,多用于获取HTML页面元素 2.document对象属性 a) alinkColor活动链接颜色 b) linkColor文本链接颜色 ...
- layui layer.open() 弹层开启后 Enter回车 遮罩层无限弹处理
解决方案: 增加success回调及其内容 如下: layer.open({ title:'更新论坛信息', type: 1, skin: 'layui-layer-rim', area: ['500 ...
- 用Jquery控制元素的上下移动 实现排序功能
在页面上,控制元素上下移动,进行排序是我们比较常用的功能,今天我用jQuery 写个 简单方便,功能齐全的实现方式. 话不多说,直接上代码,下面是基础的引入jq和html元素部分: <scrip ...
- js新开窗口避免浏览器拦截解决方案
Ajax回调函数中,打开新窗口解决方案 var w = window.open(); $.post("GetHomToTestPaper", {homeworkName:homew ...
- 关于“CheckBox”通过表单提交的问题
大多数时候CheckBox取值传到java后台都是通过js取值,ajax传值,今天改一离职同事的老代码,那家伙通过表单提交一些列的CheckBox设置,没想到的是后台死活接收不正常,name.valu ...
- Zookeeper -- 关于Zookeeper
Zookeeper是什么? 分布式协调框架 Zookeeper中文件呈树形结构,树形结构下包含多个节点,称为Znode:zk中节点存储数据不超过1M,指得是Znode中存储数据不超过1M Zookee ...
- 第2天 Java基础语法
第2天 Java基础语法 今日内容介绍 变量 运算符 变量 变量概述 前面我们已经学习了常量,接下来我们要学习变量.在Java中变量的应用比常量的应用要多很多.所以变量也是尤为重要的知识点! 什么是变 ...