スレッドインタビューの質問-スレッドは順番に交互になります

スレッドは順番に交互になります

プログラムを作成して3つのスレッドを開始します。これら3つのスレッドのIDはA、B、Cです。各スレッドはコンソールにIDを10回出力し、出力結果を順番に表示する必要があります。

例:ABCABCABCABC ...一度再帰的に...

public class TestABCLoop {
	public static void main(String[] args) {
		final ABCLoopDemo loop = new ABCLoopDemo();
		
		new Thread(new Runnable() {
			public void run() {
				for(int i=1;i<=20;i++){
					loop.loopA();
				}
			}
		},"A").start();
		
		new Thread(new Runnable() {
			public void run() {
				for(int i=1;i<=20;i++){
					loop.loopB();
				}
			}
		},"B").start();
		
		new Thread(new Runnable() {
			public void run() {
				for(int i=1;i<=20;i++){
					loop.loopC();
					System.out.println("---------第"+i+"轮-------------");
				}
			}
		},"C").start();
	}
}

class ABCLoopDemo{
	private int flag = 1; //打印标记
	private Lock l = new ReentrantLock();
	private Condition c1 = l.newCondition();
	private Condition c2 = l.newCondition();
	private Condition c3 = l.newCondition();
	
	public void loopA(){
		l.lock();
		try{
			//1. 判断
			if(flag!=1){
				c1.await();
			}
			
			//2. 打印
			System.out.println(Thread.currentThread().getName());	
			
			//3. 唤醒
			flag=2;
			c2.signal();	
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			l.unlock();
		}
	}
	public void loopB(){
		l.lock();
		try{
			//1. 判断
			if(flag!=2){
				c2.await();
			}
			
			//2. 打印
			System.out.println(Thread.currentThread().getName());	
			
			//3. 唤醒
			flag=3;
			c3.signal();	
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			l.unlock();
		}
	}
	public void loopC(){
		l.lock();
		try{
			//1. 判断
			if(flag!=3){
				c3.await();
			}
			
			//2. 打印
			System.out.println(Thread.currentThread().getName());	
			
			//3. 唤醒
			flag=1;
			c1.signal();	
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			l.unlock();
		}
	}
}

おすすめ

転載: blog.csdn.net/Java_lover_zpark/article/details/89470511