重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前言
创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联具备承接各种类型的网站设计制作、网站设计项目的能力。经过十年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。前面的例子都是多个线程在做相同的操作,比如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(); } }