Condition是java1.5中出现的,它是用来替代传统的Object类实现线程间的协作,方法类似Object类的wait();
、notify();、notifyAll();方法,Condition中的方法有:
await()对应Object类中的wait()
signal()对应Object类中的notify()
signalAll()对应Object类中的notifyAll()
Condition是一个接口,它基于Lock接口,前置条件必须是在Lock对象的保护内,就是调用Condition中的方法必须在Lock对象的lock()方法与unlock()方法之间。
Condition的实例为:Condition con = Lock对象.newCondition();
调用方法时:Condition对象.方法名()
具体实现的代码如下:
/**
*
*/
package Lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author jc
*
*/
public class ConditionLock {
//实例化ReentrantLock类对象
private Lock lock = new ReentrantLock();
//在Lock对象基础上实例化Cindition对象
private Condition cd = lock.newCondition();
/**
* @param args
*/
public static void main(String[] args) throws InterruptedException {
ConditionLock lcd = new ConditionLock();
// 实例化本类对象
// 实例化其他类对象
Aw aw = lcd.new Aw();
Si si = lcd.new Si();
// 开始aw线程
aw.start();
// 线程休眠:3秒
Thread.sleep(3000);
// 开始si线程
si.start();
}
// 内部类继承线程类
class Aw extends Thread {
// 重写run方法
public void run() {
awRun();
}
// 普通方法
public void awRun() {
// 获取锁
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取了锁");
System.out.println(Thread.currentThread().getName() + "线程休息");
try {
// Condition等待
cd.await();
System.out.println(Thread.currentThread().getName() + "得到唤醒信号");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 关闭锁
lock.unlock();
}
}
}
// 内部类继承内部类
class Si extends Thread {
// 重写run方法
public void run() {
siRun();
}
// 普通方法
public void siRun() {
// 获取锁
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取了锁");
System.out.println(Thread.currentThread().getName() + "开始工作");
for (int i = 0; i < 5; i++) {
System.out.print(i + "\t");
}
System.out.println();
System.out.println(Thread.currentThread().getName() + "工作完成");
System.out.println("发送唤醒信号");
// 发送唤醒信号
cd.signal();
// 关闭锁
lock.unlock();
}
}
}
/**
* output
* Thread-0获取了锁
* Thread-0线程休息
* Thread-1获取了锁
* Thread-1开始工作
* 0 1 2 3 4
* Thread-1工作完成
* 发送唤醒信号
* Thread-0得到唤醒信号
*/