重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

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

前言

创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联具备承接各种类型的网站设计制作、网站设计项目的能力。经过十年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。

前面的例子都是多个线程在做相同的操作,比如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();
  }
}

分享题目:Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解-创新互联
文章位置:http://cqcxhl.cn/article/ihgsc.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP