在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