package com.csdn.net.xunlei;
/** * @author widget add by 2011-06-03 16:52:12 * @description * 【《JAVA多线程之一》顺序打印ABC--讯雷面试题之一】 * 不用 java.util.concurrent.Semaphore 类来实现线程间的互斥
* 这是在csdn.net上看到一个讯雷面试题时写的。非常适合学习,拿上来 * 跟大家一起分享。如有不对的地方请指出。email: java_doc@163.com *
* @copyRight : * $ www.ideajs.com@copyRigth 理想极速网! QQ:31916326 $ * ***/ public class PrintThreadABC { transient boolean isAThread = true;
//A print target, default start A transient boolean isBThread = false;
//B print target transient boolean isCThread = false;
//C print target private Object [] LOCK = new Object[0];
//互斥器 private static int PRINTTIMES = 10;
//默认打印次数 public static void main(String[] args) { //这三个类很类似,为了学习,才写笨重一点,不过比起Semaphore(信号灯)还要好理解一点。 //其实我这个类改下,也可以跟信号灯一样牛叉的~!~~ PrintThreadABC p = new PrintThreadABC();
PrintThreadABC.PRINTTIMES = 11;
//打印10次 new Thread(p.new A()).start();
//启动A线程 new Thread(p.new B()).start();
//启动B线程 new Thread(p.new C()).start();
//启动C线程 //理解了,也就明白,同步与互斥的作用了!~~~~~ ^_^ !! } /** * A Thread 类 * 非常容易理解的一个类 * **/ public class A implements Runnable { int count = 0;
//打印次数哦 @Override public void run() {//退出线程执行的一个标志方法 // TODO Auto-generated method stub while(count < PRINTTIMES)//当count < 打印次数时 不停止线程的执行 { synchronized (LOCK) { if(isAThread)//轮到A线程打印了 { System.out.print("A");
//打印一下A count++;
//计数加1 isAThread = false;
//我打过了。 isBThread = true;
//轮到B了 isCThread = false;
///还没轮到C LOCK.notifyAll();
//唤醒所有线程,让他们两个wait的线程去竞争一下。不过还是争不过B的呀 } else { try { LOCK.wait();
//不是轮到我,我wait释放锁! } catch(InterruptedException ex) { ex.printStackTrace();
} } } } } } /** * B Thread 类 * 非常容易理解的一个类 * **/ public class B implements Runnable { int count = 0;
//打印次数哦 @Override public void run() {//退出线程执行的一个标志方法 // TODO Auto-generated method stub while(count < PRINTTIMES)//当count < 打印次数时 不停止线程的执行 { synchronized (LOCK) { if(isBThread)//轮到A线程打印了 { System.out.print("B");
//打印一下B count++;
//计数加1 isAThread = false;
//还没轮到A。 isBThread = false;
//我打过了 isCThread = true;
///轮到C LOCK.notifyAll();
//唤醒所有线程,让其它两个wait的线程去竞争一下。不过还是争不过C的呀 } else { try { LOCK.wait();
//不是轮到我,我wait释放锁! } catch(InterruptedException ex) { ex.printStackTrace();
} } } } } } /** * C Thread 类 * 非常容易理解的一个类 * **/ public class C implements Runnable { int count = 0;
//打印次数哦 @Override public void run() {//退出线程执行的一个标志方法 // TODO Auto-generated method stub while(count < PRINTTIMES)//当count < 打印次数时 不停止线程的执行 { synchronized (LOCK) { if(isCThread)//轮到A线程打印了 { System.out.print("C ");
//打印一下C count++;
//计数加1 isAThread = true;
//轮到A了 isBThread = false;
//我打过了 isCThread = false;
///我打过了 LOCK.notifyAll();
//唤醒所有线程,让其它两个wait的线程去竞争一下。不过还是争不过A的呀 } else { try { LOCK.wait();
//不是轮到我,我wait释放锁! } catch(InterruptedException ex) { ex.printStackTrace();
} } } } } } }
推荐阅读
- Java 内部类介绍
- eclipse 自动换行wordwrap 插件
- 关于myeclipse中maven项目转换相关设置
- JDK安装成功后,配置Java的环境变量
- tomcat集群和负载均衡
- android|android蓝牙主动发起配对实例
- 项目启动成功,但是Eureka页面不显示
- java技术|基于jquery的搜索自动填充功能jquery.autocomplete.min.js插件的引用