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. LLDB动态调试

  2. PHP-利用二叉堆实现TopK-算法

    介绍 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,然后截 ...

  3. HDU 1003 解题报告

    问题描述:求最大连续字串 分析:一道简单的DP,状态转移方程是d[i] = ( d[i-1]+a[i] > a[i] ) ? d[i-1]+a[i] : a[i] d[i]表示以第i个数字结尾的 ...

  4. leetcode 230. 二叉搜索树中第K小的元素(C++)

    给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输入: root = [ ...

  5. 队列问题非STL解决方案

    队列问题非STL解决方案 常年使用STL解决队列问题,以至于严重生疏队列的根本原理... 直到今日 被老师被迫 使用算法原理解决问题,方才意识到我对队列一窍不通... ...直到 经过一系列的坑蒙拐骗 ...

  6. hdu6570Wave (暴力求解)

    Problem Description Avin is studying series. A series is called "wave" if the following co ...

  7. 安全体系建设-OWASP

    OWASP Checklist Spiders, Robots and Crawlers IG- Search Engine Discovery/Reconnaissance IG- Identify ...

  8. servlet--response、request

    请求响应流程图 response 1       response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServle ...

  9. hive 取排行第二的工资

    CREATE TABLE employee( id INT , salary INT ); INSERT INTO employee , UNION ALL , UNION ALL ,; SELECT ...

  10. cgi+lighttpd上传大文件失败解决办法

    问题: - 前端页面点击上传按钮,不超过30M的小文件顺利上传到板子指定位置,上传60Md的更新包,出错,http状态码413——请求实体过大 环境: - web服务器——lighttpd1.4.30 ...