二、采用Lock锁以及await和signal方法是实现

import java.io.IOException;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* @author 作者 E-mail:
* @version 创建时间:2015-10-23 下午04:08:39 类说明
*/
public class AwaitAndSignal
{
public static void main(String[] args) throws IOException
{
Person person = new Person();
new Thread(new Consumer(person), "消费者一").start();
new Thread(new Consumer(person), "消费者二").start();
new Thread(new Consumer(person), "消费者三").start(); new Thread(new Producer(person), "生产者一").start();
new Thread(new Producer(person), "生产者一").start();
new Thread(new Producer(person), "生产者一").start();
}
} class Producer implements Runnable
{
private Person person; public Producer(Person person)
{
this.person = person;
} @Override
public void run()
{ for (int i = 0; i < 10; i++)
{
person.produce();
} } } class Consumer implements Runnable
{ private Person person; public Consumer(Person person)
{
this.person = person;
} @Override
public void run()
{ for (int i = 0; i < 10; i++)
{
person.consume();
} } } class Person
{
private int foodNum = 0; private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private final int MAX_NUM = 5; public void produce()
{
lock.lock();
try
{
while (foodNum == MAX_NUM)
{
System.out.println("box is full,size = " + foodNum);
condition.await();
}
foodNum++;
System.out.println("produce success foodNum = " + foodNum);
condition.signalAll();
}
catch(InterruptedException e)
{
e.printStackTrace();
} finally
{
lock.unlock();
} } public void consume()
{
lock.lock();
try
{
while (foodNum == 0)
{
System.out.println("box is empty,size = " + foodNum);
condition.await();
}
foodNum--;
System.out.println("consume success foodNum = " + foodNum);
condition.signalAll();
}
catch(InterruptedException e)
{
e.printStackTrace();
} finally
{
lock.unlock();
} }
}

多线程-生产者消费者(lock同步)的更多相关文章

  1. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  2. 使用Win32 API实现生产者消费者线程同步

    使用win32 API创建线程,创建信号量用于线程的同步 创建信号量 语法例如以下 HANDLE semophore; semophore = CreateSemaphore(lpSemaphoreA ...

  3. 多线程-生产者消费者(synchronized同步)

    正解博客:https://blog.csdn.net/u011863767/article/details/59731447 永远在循环(loop)里调用 wait 和 notify,不是在 If 语 ...

  4. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  5. [多线程] 生产者消费者模型的BOOST实现

    说明 如果 使用过程中有BUG 一定要告诉我:在下面留言或者给我邮件(sawpara at 126 dot com) 使用boost::thread库来实现生产者消费者模型中的缓冲区! 仓库内最多可以 ...

  6. Java实现多线程生产者消费者模型及优化方案

    生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...

  7. Python多线程-生产者消费者模型

    用多线程和队列来实现生产者消费者模型 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threading imp ...

  8. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  9. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  10. 操作系统实验 windows编程多线程 生产者消费者问题 画圆画方(内置bug版)

    实验3:随便写的 #include <windows.h> #include <string> #include <stdio.h> #pragma warning ...

随机推荐

  1. python中的set集合

    当使用爬虫URL保存时,一般会选择set来保存urls,set是集合,集合中的元素不能重复,其次还有交集,并集等集合的功能, 爬虫每次获取的网页中提取网页中的urls,并保存,这就需要利用urls = ...

  2. 【.NET】由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    前言 上段时间做项目时,遇到如题之类问题,如今过去有一段时间了,具体出现的情形忘了,当时虽然找到了解决方法,但是依旧没有弄明白出现此种情况是何种原因,后来在微软的帮助支持中心找到了答案,特此记录,以防 ...

  3. 前端vscode常用插件

    Auto Rename Tag 这是一个html标签的插件,可以让你修改一边标签,另外一边自动改变. Beautify 格式化代码插件 Braket Pair Colorizer 给js文件中的每一个 ...

  4. Datafactory 学习笔记

    1)插入汉字出现乱码的情况 select userenv('language') from dual: select * from V$NLS_PARAMETERS: 把下面变量名和变量值配置到系统环 ...

  5. 【Python开发】python发送各类邮件的方法

    转载: python发送各类邮件的主要方法 python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点. 一.相关模块介绍 发送 ...

  6. 阿里EMR原理

    hadoop2.8.5: https://hadoop.apache.org/docs/r2.8.5/ 阿里文档: EMR里可以通过 Ranger组件来实现https://help.aliyun.co ...

  7. 统计sql server 2012表的行数

    --功能:统计sql server 2012表的行数 SELECT a.name, a.object_id, b.rows, b.index_id FROM sys.tables AS a INNER ...

  8. Python学习【day01】- Python初识

    Python下载:https://www.python.org/downloads/ 下载后进行安装,安装后的Python我们称之为Python解析器 1.打印“Hello World” 安装后的Py ...

  9. ASP.NET Core WebApi使用Swagger生成API说明文档【特性版】

    ⒈新建ASP.NET Core WebAPi项目 ⒉添加 NuGet 包 Install-Package Swashbuckle.AspNetCore ⒊Startup中配置 using System ...

  10. Python简单主机批量管理工具

    一.程序介绍 需求: 简单主机批量管理工具 需求: 1.主机分组 2.主机信息使用配置文件 3.可批量执行命令.发送文件,结果实时返回 4.主机用户名密码.端口可以不同 5.执行远程命令使用param ...