Java JUC 高级线程之九 线程按序交替

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/88936034

文章目录

问题描述

面试题:据说写出来,工资多加6K。。。。

  1. 编写一个程序,开启3个线程,这三个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要打印输出的结果必须按顺序显示。如:ABCABCABC… 依次递归
  2. demo
public class TestABCAlternate {
	public static void main(String[] args) {
	
		AlternateDemo ad = new AlternateDemo();
		//现实用的时候多为这种形式
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for (int i = 1; i <= 10; i++) {
					ad.loopA(i);
				}
			}
		},"A").start();
		new Thread(new Runnable() {
					
					@Override
					public void run() {
						for (int i = 1; i <= 10; i++) {
							ad.loopB(i);
						}
					}
				},"B").start();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for (int i = 1; i <= 10; i++) {
					ad.loopC(i);
				}
			}
		},"C").start();
	}
}

class AlternateDemo{
	
	private int number = 1;//当前正在执行线程的标记
	
	private Lock lock = new ReentrantLock();
	
	private Condition condition1 = lock.newCondition();//需要3个线程通信因为有3个线程
	private Condition condition2 = lock.newCondition();//
	private Condition condition3 = lock.newCondition();//
	
	/**
	 * 
	 * @param totalLoop 循环第几轮
	 */
	public void loopA(int totalLoop) {
		
		lock.lock();
		try {
			
			//1.判断
			while(number != 1) {//当标志不等于1的时候 线程A 等待
				
				try {
					condition1.await();//进入等待
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			for (int i = 1; i <= 1 ; i++) {
				//2. 打印
				System.out.println(Thread.currentThread().getName() + "\t"+ i +  "\t" + totalLoop);
			}
			
			//3.唤醒
			number = 2;//修改标志位B的标志
			condition2.signal();//唤醒第二个线程,在其condition2.await()的地方
			
			
		} finally {
			lock.unlock();
		}
	}
	
	public void loopB(int totalLoop) {
			
			lock.lock();
			try {
				
				//1.判断
				while(number != 2) {
					
					try {
						condition2.await();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
				for (int i = 1; i <= 1 ; i++) {
					//2. 打印
					System.out.println(Thread.currentThread().getName() + "\t"+ i +  "\t" + totalLoop);
				}
				
				//3.唤醒
				number = 3;
				condition3.signal();//唤醒第三个线程,在其condition3.await()的地方
				
			} finally {
				lock.unlock();
			}
		}
	public void loopC(int totalLoop) {
		
		lock.lock();
		try {
			
			//1.判断
			while(number != 3) {
				
				try {
					condition3.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			for (int i = 1; i <= 1 ; i++) {
				//2. 打印
				System.out.println(Thread.currentThread().getName() + "\t"+ i +  "\t" + totalLoop);
			}
			
			//3.唤醒
			number = 1;
			condition1.signal();//唤醒第一个线程,在其condition1.await()的地方
			System.out.println("---------------");
			
		} finally {
			lock.unlock();
		}
	}

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/88936034