开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推

这三个线程分别为A,B,C,我们可以把这三个线程当成父,子,孙三个线程,每个线程要循环输出十次。然后要有一个类去完成他们的任务就是输出当前线程的名字,然后我们可以用condition实现三个线程的交替输出。

/**
 * 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,
 * 每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;
 * 如:ABCABC….依次递推
 * 
 * PrintABC
 * 创建人:LBM
 * 时间:2016年11月25日-上午9:34:53 
 * @version 1.0.0
 *
 */
public class PrintABC {
	public static void main(String[] args) {
		PrintClass printClass = new PrintClass();
		new Thread(new Runnable() {
			@Override
			public void run() {//线程A
				for( int i=1;i<=10;i++){
					printClass.PrintNameA(i);
				}
			}
		},"A").start();
		new Thread(new Runnable() {//线程B
			@Override
			public void run() {
				for( int i=1;i<=10;i++){
					printClass.PrintNameB(i);
				}
			}
		},"B").start();
		new Thread(new Runnable() {//线程C
			@Override
			public void run() {
				for( int i=1;i<=10;i++){
					printClass.PrintNameC(i);
				}
			}
		},"C").start();
	}
	static  class PrintClass{
		private String flag = "A";
		Lock lock = new ReentrantLock();
		Condition conditionA = lock.newCondition();//控制A线程运行
		Condition conditionB = lock.newCondition();//控制B线程运行
		Condition conditionC = lock.newCondition();//控制C线程运行
		public void PrintNameA(int i){//线程A的任务
			lock.lock();
			while (!"A".equals(flag)) {
				try {
					conditionA.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			try{
			System.out.println("A线程第"+i+"次输出---"+Thread.currentThread().getName());
			flag ="B";
			conditionB.signal();
			}finally {
				lock.unlock();
			}
		}
		
		public void PrintNameB(int i){//线程B的任务
			lock.lock();
			while (!"B".equals(flag)) {
				try {
					conditionB.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			try{
			System.out.println("B线程第"+i+"次输出---"+Thread.currentThread().getName());
			flag ="C";
			conditionC.signal();
			}finally {
				lock.unlock();
			}
		}
		
		public void PrintNameC(int i){//线程C的任务
			lock.lock();
			while (!"C".equals(flag)) {
				try {
					conditionC.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			try{
			System.out.println("C线程第"+i+"次输出---"+Thread.currentThread().getName());
			flag ="A";
			conditionA.signal();
			}finally {
				lock.unlock();
			}
		}
	}
}
打印结果如下:

A线程第1次输出---A
B线程第1次输出---B
C线程第1次输出---C
A线程第2次输出---A
B线程第2次输出---B
C线程第2次输出---C
A线程第3次输出---A
B线程第3次输出---B
C线程第3次输出---C
A线程第4次输出---A
B线程第4次输出---B
C线程第4次输出---C
A线程第5次输出---A
B线程第5次输出---B
C线程第5次输出---C
A线程第6次输出---A
B线程第6次输出---B
C线程第6次输出---C
A线程第7次输出---A
B线程第7次输出---B
C线程第7次输出---C
A线程第8次输出---A
B线程第8次输出---B
C线程第8次输出---C
A线程第9次输出---A
B线程第9次输出---B
C线程第9次输出---C
A线程第10次输出---A
B线程第10次输出---B
C线程第10次输出---C


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值