1.  
  1. public class Test {
  2. public static void main(String[] args) {
  3. List<String> list = new ArrayList<>(1);
  4. LockEntity lockEntity = new LockEntity();
  5. new Thread(new PThread(list, lockEntity)).start();
  6. new Thread(new CThread(list, lockEntity)).start();
  7. }
  8. }
  9.  
  10. /**
  11. * 生产者
  12. */
  13. class PThread implements Runnable {
  14. private List<String> list;
  15. private LockEntity lockEntity;
  16. private AtomicInteger integer = new AtomicInteger();
  17.  
  18. public PThread(List<String> list, LockEntity lockEntity) {
  19. this.list = list;
  20. this.lockEntity = lockEntity;
  21. }
  22.  
  23. @Override
  24. public void run() {
  25. while (true) {
  26. try {
  27. Thread.sleep(1000);
  28. //上锁
  29. lockEntity.lock.lock();
  30. if (lockEntity.flag) {
  31. String data = integer.getAndIncrement() + "";
  32. list.add(data);
  33. System.out.println("生产者线程,生产一个数据:" + data);
  34. lockEntity.flag = false;
  35. lockEntity.condition.signal(); //唤醒
  36. } else {
  37. lockEntity.condition.await(); //等待
  38. }
  39.  
  40. } catch (InterruptedException e) {
  41. e.printStackTrace();
  42. } finally {
  43. lockEntity.lock.unlock();
  44. }
  45. }
  46. }
  47. }
  48.  
  49. class CThread implements Runnable {
  50. private List<String> list;
  51. private LockEntity lockEntity;
  52.  
  53. public CThread(List<String> list, LockEntity lockEntity) {
  54. this.list = list;
  55. this.lockEntity = lockEntity;
  56.  
  57. }
  58.  
  59. @Override
  60. public void run() {
  61. while (true) {
  62. try {
  63. lockEntity.lock.lock();
  64. if (!lockEntity.flag) {
  65. String data = list.remove(0);
  66. System.out.println("消费者线程,消费了一个数据:" + data);
  67. lockEntity.flag = true;
  68. lockEntity.condition.signal();
  69. } else {
  70. lockEntity.condition.await();
  71. }
  72. } catch (InterruptedException e) {
  73. e.printStackTrace();
  74. } finally {
  75. lockEntity.lock.unlock();
  76. }
  77. }
  78. }
  79. }
  80.  
  81. /**
  82. * 封装锁等信息
  83. */
  84. class LockEntity {
  85. public boolean flag = true;
  86. public Lock lock = new ReentrantLock();
  87. Condition condition = lock.newCondition();
  88. }
  1.  
  1. 测试结果如下

  1.  

多线程模拟生产者消费者示例之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. P1058立体图(面对代码解释)

    传送 样例: 输出样例: (洛谷上面的那个太丑了就不放了) 大佬博客在此 乍一看好像真的没有什么思路 所以我们结合ybr大佬的代码进行分析 疑点都将在代码下面进行分析(面对代码做题模式开始) #inc ...

  2. DB-MDM:MDM/主数据管理 百科

    ylbtech-DB-MDM:MDM/主数据管理 百科 主数据管理(MDM Master Data Management)描述了一组规程.技术和解决方案,这些规程.技术和解决方案用于为所有利益相关方( ...

  3. CentOS7配置Tomcat8开机自动启动

    1.创建文件 # vi /etc/systemd/system/tomcat.service [Unit] Description=Tomcat8540 After=syslog.target net ...

  4. (appium+python)UI自动化_02_appium启动手机app

    前提:需先安装配置好appium+python自动化环境,已配置好环境的小伙伴可以参考以下步骤启动Android app,具体步骤如下: 一.USB连接手机 (1)手机USB连接电脑 (2)手机打开开 ...

  5. tbox协程使用之切换与等待

    tbox的协程实现,是stackfull模式的,需要指定独立堆栈和协程函数,目前暂时还不能像golang那样实现堆栈的动态增长,之后会对其进行支持. 目前提供下面一些功能特性: 1. 提供yield切 ...

  6. 21、numpy—Matplotlib

    NumPy Matplotlib Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 P ...

  7. protocols - 协议定义文件

    描述 该文件为普通 ASCII 文件,它描述了 TCP/IP 子系统中各类 DARPA internet 协议族.你应该参考这个文件, 而不是使用 ARPA 的 include 文件中的号码, 更不必 ...

  8. DTS

    一.DTS的加载过程   如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file.通过DTC(Device Tr ...

  9. C语言文件读写操作

    C语言实现文件读写,注意区分几个方法: 写入: fwrite() //个人认为这个最好,可是实现写入任何数据类型,任何长度 fputs() //写入一个字符串,字符串长度不能太长,具体的长度未知,但估 ...

  10. python类中方法__str__()和__repr__()简单粗暴总结

    在交互式模式下,类中同时实现__str__()和__repr__()方法: 直接输入实例名称显示repr返回的类容: 用print打印实例名称显示str返回的内容: >>> clas ...