今天被问了个这个问题,脑子当时给抽筋了,完全给木掉了,回来好好写了边,怎么会当时写不出来呢。。。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test421 extends Thread {
public void run() {
Customer a = new Customer();
a.start();
Producer b = new Producer();
b.start();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test421 c = new Test421();
c.start();
}
int key = 0;
Lock lock = new ReentrantLock();
Condition condempty = lock.newCondition();
Condition condfull = lock.newCondition();
class Customer extends Thread {
public void run() {
while (true) {
lock.lock();
try {
while (key < 1) {
// System.out.println("await");
condempty.await();
// System.out.println("start");
}
System.out.println("消费了" + key);
key--;
condfull.signalAll();
lock.unlock();
// return ;
Thread.sleep(12);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Producer extends Thread {
public void run() {
while (true) {
try {
// Thread.sleep(50);
lock.lock();
while (key >= 1000) {
condfull.await();
}
// a++;
key++;
System.out.println("生产了" + key);
// Thread.sleep(5000);
condempty.signalAll();
lock.unlock();
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
锁和条件这种方式比较重要的一点要注意的是:就算condition.sigalAll();别的线程也一定要等到lock的释放才可以继续下去,换句话说,await的时候很重要的一点是他会阻塞掉,并且隐含的会释放掉锁,这很关键,只有这样别的线程才能获得锁,才能继续执行下去。
而
sigalAll 的时候并不执行释放锁操作,只有显示的调用lock.unlock后,锁才被释放。
分享到:
相关推荐
ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...
对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模...
电子商务重新定义了传统的流通模式,减少了中间环节,使得生产者和消费者的直接交易成为可 能,从而在一定程度上改变了整个社会经济运行的方式。 电子商务一方面破除了时空的壁垒,另一方面又提供了丰富的信息资源...
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...
12.synchronized (生产者和消费) 13.String 和 StringBuffer 14.Serializable 15.MVC (Struts的工作流程) 16.什么是MDA 17.tcp与udp的区别 18.链表与散列表和数组的区别 19.堆和栈的区别 20.ejb的分类及...
Services与它们的消费者之间共享的是Schema和Contract ;以适用为目的的设计 14、以下哪些是功能规格说明书的组成元素?远景/范围总结;背景信息;设计目标;使用场景;功能和服务的描述;组件规格说明(产品和配置...
消费者任何时候需要某种产品,只需向工厂请求即可。消 工厂模式 费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如 何创建及如何向客户端提供。 2、BUILDER — MM 最爱听的就是...
有能力的话,可以找一些相关兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到...