JDK1.5之後怎麼玩轉多線程(Lock和Condition的使用)

          在JDK1.5之前同步使用的是Synchronized的方法,而線程的通信使用的是wait、Notify、NotifyAll等方法, 那麼1.5之後就可以使用新的類庫 Lock、Condition來完成。使用新的類庫有一個顯著的優勢在於: 1.5之前線程的通信的等待和提醒綁定的是對象,例如Object等。而現在可以實現不同線程綁定不同的Condition用於提醒和等待這樣,工作效率會大幅增加。

          

         代碼如下:


package ConditionByGroup;

public class TestMain {

	public TestMain() {
		
	}
	
	public static void main(String[] args) {
		Service service = new Service();
		ThreadA threadA = new ThreadA(service);
		
		ThreadB threadB = new ThreadB(service);
		
		ThreadC threadC = new ThreadC(service);
		
		threadA.start();
		
		threadB.start();
		
		threadC.start();
		
	}

}





package ConditionByGroup;

public class ThreadA extends Thread{
	private Service service;
	public ThreadA(Service service) {
		this.service = service;
	}
	
	public void run(){
		try {
			service.testA();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}







package ConditionByGroup;

public class ThreadB extends Thread{

	private Service service;
	public ThreadB(Service service) {
		this.service = service;
	}
	
	public void run(){
		try {
			service.testB();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


}







package ConditionByGroup;

public class ThreadC extends Thread{

	private Service service;
	
	public ThreadC(Service service) {
		this.service = service;
	}
	
	public void run(){
		service.testC();
	}


}










package ConditionByGroup;

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

public class Service {
	private Lock lock = new ReentrantLock();
	
	private Condition conditionA = lock.newCondition();
	private Condition conditionB = lock.newCondition();
	
	public Service() {
	}

	public void testC() {
		lock.lock();
		System.out.println("C");
		conditionA.signal();
		conditionB.signal();
		System.out.println("CC");
		lock.unlock();
	}

	public void testA() throws InterruptedException {
		lock.lock();
		System.out.println("A");
		conditionA.await();
		System.out.println("AA");
		lock.unlock();
	}

	public void testB() throws InterruptedException {
		lock.lock();
		System.out.println("B");
		conditionB.await();
		System.out.println("BB");
		lock.unlock();
	}

}


不懂的可以加我微信   wangyan199366
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章