在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