天天看点

Lock锁-----Condition接口

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得到唤醒信号
 */