java线程 使用显示的lock 和condition

package org.rui.thread.block2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 使用顯示的lock 和condition,
 * 只有在更加困難的多線程問題中才是必須使用的
 *
 * @author lenovo
 *
 */
// wax蜡 电气自动方式
public class WaxOMatic2 {

	public static void main(String[] args) throws InterruptedException {
		Car car = new Car();
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new WaxOff(car));
		exec.execute(new WaxOn(car));
		TimeUnit.SECONDS.sleep(5);
		exec.shutdownNow();// 中断所有任务
		// shutdownNow 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表
	}
}

class Car {
	private Lock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();//管理任務的通信,不包含任何有關處理狀態信息
	// 表示 抛光 、上蜡的处理状态
	private boolean waxOn = false;

	// 上蜡
	public/* synchronized */void waxed() {
		lock.lock();
		try {
			waxOn = true;// ready to buff
			// notifyAll();
			condition.signalAll();
		} finally {
			lock.unlock();
		}
	}

	// 抛光
	public/* synchronized */void buffed() {

		lock.lock();
		try {
			waxOn = false;// ready to another coat of wax
			// notifyAll();
			condition.signalAll();
		} finally {
			lock.unlock();
		}
	}

	// wait 上蜡
	public/* synchronized */void waitForWaxing() throws InterruptedException {
		lock.lock();
		try {
			while (waxOn == false) {
				// wait();// 挂起这个任务
				condition.await();
			}
		} finally {
			lock.unlock();
		}

	}

	// wait 抛光
	public /*synchronized*/ void waitForBuffing() throws InterruptedException {

		lock.lock();
		try {
			while (waxOn == true) {
				// wait();// 挂起这个任务
				condition.await();
			}
		} finally {
			lock.unlock();
		}
	}
}

class WaxOn implements Runnable {
	private Car car;

	public WaxOn(Car c) {
		car = c;
	}

	@Override
	public void run() {
		try {
			while (!Thread.interrupted()) {
				System.out.println("wax on!");
				TimeUnit.MILLISECONDS.sleep(200);
				car.waxed();// 上蜡
				car.waitForBuffing();// 等 抛光
			}
		} catch (InterruptedException e) {
			System.out.println("通过中断退出");
			// e.printStackTrace();
		}
		System.out.println("ending Wax on task");
	}

}

// /////////////////////

class WaxOff implements Runnable {
	private Car car;

	public WaxOff(Car c) {
		car = c;
	}

	@Override
	public void run() {
		try {
			while (!Thread.interrupted()) {
				car.waitForWaxing();// 等 吐蜡
				System.out.println("wax off!");
				TimeUnit.MILLISECONDS.sleep(200);
				car.buffed();// 抛光

			}
		} catch (InterruptedException e) {
			System.out.println("通过中断退出");
			// e.printStackTrace();
		}
		System.out.println("ending Wax Off task");
	}

}

/*
 * output:(95% match)
wax off!
wax on!
...
wax on!
wax off!
wax on!
wax off!
wax on!
wax off!
wax on!
wax off!
wax on!
wax off!
wax on!
wax off!
wax on!
wax off!
通过中断退出
通过中断退出
ending Wax Off task
ending Wax on task

 */

时间: 2024-08-29 19:59:42

java线程 使用显示的lock 和condition的相关文章

【Java并发工具类】Lock和Condition

前言 Java SDK并发包通过Lock和Condition两个接口来实现管程,其中Lock用于解决互斥问题,Condition用于解决同步问题.我们需要知道,Java语言本身使用synchronized实现了管程的,那么为什么还在SDK中提供另外一种实现呢?欲知为何请看下文. 下面将先阐述再造管程的理由,然后详细介绍Lock和Condition,最后再看实现同步机制时是选择synchronized还是SDK中的管程. 再造管程的理由 Java本就从语言层面实现了管程,然而后面又在SDK中再次现

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest

线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值为空时的情况:load()的返回值是一个代理对象,而get()却是一个实实在在的对象:所以当返回对象为空是,get()返回null,load()返回一个异常对象:具体分析如下: 一个读写锁的缓存库案例:用上面那道面试题分析则很好理解: 线程阻塞问题:运用多个Condition对象解决 2. Lock

Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁

synchronized 是互斥锁: lock 更广泛,包含了读写锁 读写锁特点: 1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) 互斥锁特点: 一次只能一个线程拥有互斥锁,其他线程只有等待 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronize

JAVA线程间协作:Condition

内置条件队列存在一些缺陷.每个内置锁都只能有一个相关联的条件队列,因而在像BounderBuffer这种类中,多个线程可能在同一个条件队列上等待不同的条件谓词,并且在最常见的加锁模式下公开条件队列对象.这些因素都使得无法满足在使用notifyAll时所有等待线程为统一类型的需求.如果想编写一个带有多个条件谓词的并发对象,或者想获得除了条件队列可见性之外的更多控制权,就可以使用显示的Lock和Condition而不是内置锁和条件队列,这是一种更灵活的选择. 一个Condition和一个Lock关联

【Java线程】锁机制:synchronized、Lock、Condition

http://www.infoq.com/cn/articles/java-memory-model-5  深入理解Java内存模型(五)——锁 http://www.ibm.com/developerworks/cn/java/j-jtp10264/  Java 理论与实践: JDK 5.0 中更灵活.更具可伸缩性的锁定机制 http://blog.csdn.net/ghsau/article/details/7481142 1.synchronized 把代码块声明为 synchronize

java线程通讯——使用Lock和Condition代替synchronized 和 wait, notify notifyAll()

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作. 此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象. 使用生产者和消费者为例!!! import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 使

java 线程安全 Lock

java.util.concurrent.locks 对于线程安全我们前面使用了synchronized关键字,对于线程的协作我们使用Object.wait()和Object.notify().在JDK1.5中java为我们提供了Lock来实现与它们相同的功能,并且性能优于它们,在JDK1.6时,JDK对synchronized做了优化,在性能上两种方式差距不大了. 一.为什么出现lock synchronized修饰的代码块,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,

Java线程新特性--- Lock

在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks包下面,里面有三个重要的接口Condition.Lock.ReadWriteLock. Condition Condition将Object监视器方法(wait.notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待set(wait-set). Lock L