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://www.jxjierui.cn/article/ihgsc.html


咨询
建站咨询
