순서대로 교체 인쇄 ABC

package com.atguigu.juc;
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;
/*
  • 프로그램 을 만 들 고 3 개의 스 레 드 를 엽 니 다. 이 세 스 레 드 의 ID 는 각각 A, B, C 입 니 다. 각 스 레 드 는 자신의 ID 를 화면 에 10 번 인쇄 하고 출력 결 과 를 순서대로 표시 해 야 합 니 다.예 를 들 어: ABCABCABC... 순서대로 * / public class TestAlternate {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 c1 = lock.newCondition();
    private Condition c2 = lock.newCondition();
    private Condition c3 = lock.newCondition();
    
    public void loopA(int totalLoop){
    	lock.lock();
    	
    	try {
    		
    		//  
    		if(number != 1){
    			try {
    				c1.await();
    			} catch (InterruptedException e) {
    			}
    		}
    		
    		//  
    		for (int i = 1; i <= 1; i++) {
    			System.out.println(Thread.currentThread().getName() + " : " + i + " : " + totalLoop);
    		}
    		
    		//  
    		number = 2;
    		c2.signal();
    		
    	} finally {
    		lock.unlock();
    	}
    }
    
    public void loopB(int totalLoop){
    	lock.lock();
    	
    	try {
    		
    		//  
    		if(number != 2){
    			try {
    				c2.await();
    			} catch (InterruptedException e) {
    			}
    		}
    		
    		//  
    		for (int i = 1; i <= 1; i++) {
    			System.out.println(Thread.currentThread().getName() + " : " + i + " : " + totalLoop);
    		}
    		
    		//  
    		number = 3;
    		c3.signal();
    		
    	} finally {
    		lock.unlock();
    	}
    }
    
    public void loopC(int totalLoop){
    	lock.lock();
    	
    	try {
    		
    		//  
    		if(number != 3){
    			try {
    				c3.await();
    			} catch (InterruptedException e) {
    			}
    		}
    		
    		//  
    		for (int i = 1; i <= 1; i++) {
    			System.out.println(Thread.currentThread().getName() + " : " + i + " : " + totalLoop);
    		}
    		
    		//  
    		number = 1;
    		c1.signal();
    		
    	} finally {
    		lock.unlock();
    	}
    }
    

    }

    좋은 웹페이지 즐겨찾기