public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>(1);
LockEntity lockEntity = new LockEntity();
new Thread(new PThread(list, lockEntity)).start();
new Thread(new CThread(list, lockEntity)).start();
}
} /**
* 生产者
*/
class PThread implements Runnable {
private List<String> list;
private LockEntity lockEntity;
private AtomicInteger integer = new AtomicInteger(); public PThread(List<String> list, LockEntity lockEntity) {
this.list = list;
this.lockEntity = lockEntity;
} @Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
//上锁
lockEntity.lock.lock();
if (lockEntity.flag) {
String data = integer.getAndIncrement() + "";
list.add(data);
System.out.println("生产者线程,生产一个数据:" + data);
lockEntity.flag = false;
lockEntity.condition.signal(); //唤醒
} else {
lockEntity.condition.await(); //等待
} } catch (InterruptedException e) {
e.printStackTrace();
} finally {
lockEntity.lock.unlock();
}
}
}
} class CThread implements Runnable {
private List<String> list;
private LockEntity lockEntity; public CThread(List<String> list, LockEntity lockEntity) {
this.list = list;
this.lockEntity = lockEntity; } @Override
public void run() {
while (true) {
try {
lockEntity.lock.lock();
if (!lockEntity.flag) {
String data = list.remove(0);
System.out.println("消费者线程,消费了一个数据:" + data);
lockEntity.flag = true;
lockEntity.condition.signal();
} else {
lockEntity.condition.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lockEntity.lock.unlock();
}
}
}
} /**
* 封装锁等信息
*/
class LockEntity {
public boolean flag = true;
public Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
}

测试结果如下

												

多线程模拟生产者消费者示例之Lock的更多相关文章

  1. 多线程模拟生产者消费者示例之BlockQueue

    public class Test { public static void main(String[] args){ //创建一个阻塞队列,边界为1 BlockingQueue<String& ...

  2. 多线程模拟生产者消费者示例之wait/notify

    public class Test { public static void main(String[] args) throws InterruptedException { List<Str ...

  3. java多线程模拟生产者消费者问题,公司面试常常问的题。。。

    package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...

  4. 【多线程】--生产者消费者模式--Lock版本

    在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...

  5. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  6. Android-Java多线程通讯(生产者 消费者)&10条线程对-等待唤醒/机制的管理

    上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客A ...

  7. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  8. Java多线程_生产者消费者模式2

    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...

  9. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

随机推荐

  1. Js获取屏幕宽度、高度

    document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...

  2. womenzijide_jiafenxiang

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  3. MYSQL之union和order by分析([Err] 1221 - Incorrect usage of UNION and ORDER BY)

    我在一个业务中采用了按月的分表策略,当查询的条件跨月的时候,使用了union all汇总2个表的数据,并按插入时间倒序排列.查询并不复杂,但是当执行的时候却报错了. SELECT * FROM `ta ...

  4. scrapy xpath xpath('---').xpath('string(.)') 提取子元素全部文本

    product.xpath("div//div[@class='a-row a-spacing-mini'][1]/div[2]").xpath('string(.)')

  5. Delphi IdHttp组件+IdHttpServer组件实现文件下载服务

     http://blog.csdn.net/xxkku521/article/details/16864759 Delphi IdHttp组件+IdHttpServer组件实现文件下载服务 2013- ...

  6. websocket初体验

    (function (window) { var wsUri = "ws://echo.websocket.org:9150"; var output; MyWebSocket = ...

  7. Python专题三字符串的基础知识

    Python专题三字符串的基础知识 在Python中最重要的数据类型包括字符串.列表.元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引号. ...

  8. datastudio 里关于with as 的用法。

    datastudio 里sql 语句的写法,加入with as 语法. 这样方便查询,易于维护.以后都这样写. 优点: 1 易于维护,可以复用代码块 2 优化书写逻辑,方便查阅理解. 3  性能方面优 ...

  9. How to resolve error “Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7…” when building in Android Studio Ask Question

    //implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation & ...

  10. SQLMap使用总结

    支持模式:布尔/时间/报错/联合查询/堆查询 支持数据库:MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM ...