广告
返回顶部
首页 > 资讯 > 精选 >Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解
  • 500
分享到

Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

java多线程ava 2023-05-30 23:05:57 500人浏览 泡泡鱼
摘要

前言前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作。大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变量做tickets–操作,这就是大名鼎鼎

前言

前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作。大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变量做tickets–操作,这就是大名鼎鼎的生产者和消费者模式。

正文

一,生产者-消费者模式也是多线程

生产者和消费者模式也是多线程的范例。所以其编程需要遵循多线程的规矩。

首先,既然是多线程,就必然要使用同步。上回说到,synchronized关键字在修饰函数的时候,使用的是“this”,所以在同一个类中的函数被synchronized修饰后,使用的是同一把锁。线程调用这些函数时,不管调用的是tickets++操作函数,还是tickets–函数,都会先去判断是否加锁了,得到锁之后再去进行具体的操作。

我们先用代码把程序中的资源,生产者,消费者表示出来。

package com.jimmy.ThreadCommunication;class Resource{  // 资源类  private String productName; // 资源名称  private int count = 1;    // 资源编号  public void produce(String name){  // 生产资源函数    this.productName = name + count;    count ++;  // 资源编号递增,用来模拟资源递增    System.out.println(Thread.currentThread().getName()+"...生产者.."+this.productName);  }  public void consume() { // 消费资源函数    System.out.println(Thread.currentThread().getName()+"...消费者.."+this.productName);      }}class Producer implements Runnable{ // 生产者类,用于开启生产者线程  private Resource res;  //生产者初始化就要分配资源  public Producer(Resource res) {      this.res = res;  }  @Override  public void run() {    for (int i = 0; i < 10; i++) {           res.produce("bread");   // 循环生产10次    }  }}class Comsumer implements Runnable{  // 消费者类,用于开启消费者线程  private Resource res;  //同理,消费者一初始化也要分配资源  public Comsumer(Resource res) {    this.res = res;  }  @Override  public void run() {    for (int i = 0; i < 10; i++) {           res.consume(); // 循环消费10次    }  }}public class ProducerAndConsumer1 {  public static void main(String[] args) {    Resource resource = new Resource(); // 实例化资源    Producer producer = new Producer(resource); // 实例化生产者和消费者类,它们取得同一个资源    Comsumer comsumer = new Comsumer(resource);    Thread threadProducer = new Thread(producer); // 创建1个生产者线程    Thread threadComsumer = new Thread(comsumer); // 创建1个消费者线程    threadProducer.start(); // 分别开启线程    threadComsumer.start();  }}

--结束END--

本文标题: Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

本文链接: https://www.lsjlt.com/news/222115.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 函数指针与函数对象:解锁代码的隐藏潜力
    c++++ 函数指针指向函数,允许通过指针调用函数。函数对象是重载了 operator() 操作符的类或结构,可像函数一样被调用。它们在使用回调函数时很有用,回调函数是传递给另一个函数作...
    99+
    2024-04-29
    c++ 函数指针 函数对象
  • php中括号代表什么意思
    中括号 ([]) 在 php 中用于:1. 数组声明和访问;2. 条件语句代码块包围;3. 函数定义代码块包围;4. 类定义代码块包围。 中括号在 PHP 中的含义 中括号 ([]) ...
    99+
    2024-04-29
    键值对
  • golang匿名函数的用法
    匿名函数在 go 中没有名称,可作为参数传递给其他函数。用法:语法:func([参数列表]) ([返回值列表]) { // 函数体 }可省略参数和返回值。可直接传递给其他函数。实战案例:...
    99+
    2024-04-29
    golang 匿名函数
  • php中continue的用法
    continue 用于跳过当前循环中的剩余语句,继续执行下一轮循环。它通常用于检测条件跳过循环部分或根据条件执行不同的操作。 PHP 中 continue 的用法 什么是 contin...
    99+
    2024-04-29
  • php中的定界符是指什么
    php 中的定界符有 5 种类型:分号、大括号、方括号、圆括号以及单引号和双引号,用于分隔代码块和语句,指定数组元素,括起函数参数和条件表达式,并保护字符串中的特殊字符。 PHP 中的...
    99+
    2024-04-29
    作用域
  • php中并且怎么表示
    php 中的 and 计算符 (&&) 用于连接两个布尔表达式,并返回一个布尔值:两个表达式都为 true 时,结果为 true否则,结果为 false该计算符优先级高于...
    99+
    2024-04-29
  • 如何将对象转换成数组?
    在 javascript 中将对象转换为数组的方法:使用 object.keys() 获取属性键数组。使用 object.values() 获取属性值数组。使用 map() 和 obje...
    99+
    2024-04-29
    数组 对象 键值对
  • php中die函数的作用
    php 中 die 函数的作用是立即终止脚本执行并输出消息字符串。该函数在检测到严重错误或异常时、需要立即停止脚本执行或将错误信息发送到日志文件中时使用。替代方法包括 exit() 函数...
    99+
    2024-04-29
  • php中如何从URL中获取参数
    从 php 中的 url 中获取参数可使用 $_get 超全局变量:确定请求方法为 get。使用 $_get 数组访问参数:键为参数名,值是参数值。 如何从 PHP 中的 URL 中获...
    99+
    2024-04-29
  • php中echo怎么换行
    在 php 中,实现 echo 换行的方法有:echo "" 标签:在浏览器中换行。echo "\n":在文本文件或命令行中换行。使用 php_eol 常量:自动检测...
    99+
    2024-04-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作