1. 程式人生 > >編寫一個程式,開啟3個執行緒,這3個執行緒的ID分別為A、B、C,每個執行緒將自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC

編寫一個程式,開啟3個執行緒,這3個執行緒的ID分別為A、B、C,每個執行緒將自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC

package test1;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 編寫一個程式,開啟3個執行緒,
 * 這3個執行緒的ID分別為A、B、C,
 * 每個執行緒將自己的ID在螢幕上列印10遍,
 * 要求輸出結果必須按ABC的順序顯示;
 * 如:ABCABC….依次遞推
 * 
 * 設計:LOCK+condition(可以把A、B、C理解成主執行緒,子執行緒,孫執行緒)
 * @author Mahone
 *
 */
public class Test3 {
	public static void main(String[] args) {
		Test3 obj = new Test3();
		obj.init();
	}
	
	private void init() {
		final Test3Business tb = new Test3Business();
		
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					tb.printA();
				}
			}
		});
		t1.setName("A");
		
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					tb.printB();
				}
			}
		});
		t2.setName("B");
		
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					tb.printC();
				}
			}
		});
		t3.setName("C");
		
		t1.start();
		t2.start();
		t3.start();
	}
}

class Test3Business {
	
	private String flag = "A";
	
	private Lock lock = new ReentrantLock();
	
	private Condition cA = lock.newCondition();
	private Condition cB = lock.newCondition();
	private Condition cC = lock.newCondition();
	
	public void printA () {
		try {
			lock.lock();
			if (!flag.equals("A")) {
				cA.await();
			}
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
			flag = "B";
			cB.signal();
		} catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
	
	public void printB () {
		try {
			lock.lock();
			if (!flag.equals("B")) {
				cB.await();
			}
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
			flag = "C";
			cC.signal();
		} catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
	
	public void printC () {
		try {
			lock.lock();
			if (!flag.equals("C")) {
				cC.await();
			}
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
			flag = "A";
			cA.signal();
		} catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
}