java线程之生产者消费者

看了毕向东老师的生产者消费者,就照着视频参考运行了一下,感觉还好

这个值得学习的是条理特别清晰:

ProducterConsumerDemo.java中,一个资源类Resources,生产者消费者都可以访问的到。

生产者类Producter,消费者Consumer都实现了Runnable接口,在其中的run方法中实现重载,对共享资源进行生产和消费

优化:

如果以后需要加入项目中,对ProducterConsumerDemo类中加一个构造方法,public ProducterConsumerDemo(){...},实例化对象即可调用

代码:

 1 class  ProducterConsumerDemo
 2 {
 3     public static void main(String[] args)
 4     {
 5         Resources  r =new Resources();
 6         Productor  pro =new Productor(r);
 7         Consumer   con = new Consumer(r);
 8
 9         Thread t1 =new Thread(pro);
10         Thread t2 =new Thread(con);
11         t1.start();
12         t2.start();
13         System.out.println("Hello World!");
14     }
15 }
16
17 class Resources
18 {
19     private String name;
20     private int count =1;
21     private boolean flag =false;
22
23     public synchronized void set(String name)
24     {
25        if(flag)
26            try{this.wait();}catch(Exception e){}
27        this.name = name+"--"+count++;
28
29        System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
30        flag =true;
31        //唤醒对方进程
32        this.notify();
33
34     }
35     public synchronized void out()
36     {
37        if(!flag)
38            try{this.wait();}catch(Exception e){}
39
40        System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name);
41        flag =false;
42        //唤醒对方进程
43        this.notify();
44
45     }
46 }
47
48 class Productor implements Runnable
49 {
50     private Resources res;
51     Productor(Resources res){
52         this.res =res;
53     }
54     public void run(){
55         while(true){
56             res.set("++商品++");
57         }
58     }
59
60 }
61
62 class Consumer  implements Runnable
63 {
64     private Resources res;
65     Consumer(Resources res){
66         this.res =res;
67     }
68     public void run(){
69         while(true){
70             res.out();
71         }
72     }
73
74 }

由于自己需要的功能是,生产者消费者对一个二维数组进行操作,所以在其基础上加了资源Resources类的成员属性。实现存取功能

算是一个框架吧,留存:

 1 class  ProducterConsumerArr2D
 2 {
 3     public static void main(String[] args)
 4     {
 5         Resources  r =new Resources();
 6         Productor  pro =new Productor(r);
 7         Consumer   con = new Consumer(r);
 8
 9         Thread t1 =new Thread(pro);
10         Thread t2 =new Thread(con);
11         t1.start();
12         t2.start();
13         System.out.println("Hello World!");
14     }
15 }
16
17 class Resources
18 {
19     private String name;
20     private int count =1;
21     private float[][] arr2D=new float[5][5];       //为它分配5行5列的空间大小
22     private boolean flag =false;
23
24     public synchronized void set(String name)
25     {
26        if(flag)
27            try{this.wait();}catch(Exception e){}
28        //需放在count++前面
29         for(int i=0;i<5;i++)
30            for(int j=0;j<5;j++)
31         {
32            arr2D[i][j]=(float)count;
33         }
34        this.name = name+"--"+count++;
35        System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
36
37        flag =true;
38        //唤醒对方进程
39        this.notify();
40
41     }
42     public synchronized void out()
43     {
44        if(!flag)
45            try{this.wait();}catch(Exception e){}
46
47        System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name+"二维数组任意元素"+arr2D[2][2]);
48        flag =false;
49        //唤醒对方进程
50        this.notify();
51
52     }
53 }
54
55 class Productor implements Runnable
56 {
57     private Resources res;
58     Productor(Resources res){
59         this.res =res;
60     }
61     public void run(){
62         while(true){
63             res.set("++二维数组存取++");
64         }
65     }
66
67 }
68
69 class Consumer  implements Runnable
70 {
71     private Resources res;
72     Consumer(Resources res){
73         this.res =res;
74     }
75     public void run(){
76         while(true){
77             res.out();
78         }
79     }
80
81 }

ProducterConsumerArr2D.java

当然,这个只针对支持两个互相独立的线程,如果继续加入多个线程(>2)肯定还会有资源数据出错的问题,继续学习

时间: 2024-12-30 20:10:05

java线程之生产者消费者的相关文章

Java 线程池 +生产者消费者+MySQL读取300 万条数据

1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解决办法 多线程读取, 生产者 每次获取200 条数据, 消费者去消费.(这里 主要是根据MySQL分页去获取下一个200 条数据) 1.4 代码 1.4.1 调用方法 /** * 线程启动 */ public void update() { //redis操作类 HashRedisUtil redi

Java线程通信-生产者消费者问题

线程通信示例--生产者消费者问题 这类问题描述了一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费.假设仓库中没有产品,则生产者可以将 产品放入仓库,有产品,则停止生产并等待,直到仓库中的产品被消费这取走为止. 如果仓库中放油产品,则消费者可以将产品取走消费,否则停止消费并等待,直到 仓库中再次放入产品为止. 显然,这是一个同步问题,生产者和消费这共享同一资源, 并且生产者和消费这之间彼此依赖,互为条件向前推进.Java提供了3个方法解决了线程间的

Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同步:synchronized 多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是加入同步后因为需要等待,所以效率相对低下. 如:一个苹果,自己一个人去咬怎么都不会出问题,但是

Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. BlockingQueue 下面来逐一分析. 1. wait()/notify() 第一种实现,利用根类Object的两个方法wait()/notify(),来停止或者唤醒线程的执行:这也是最原始的实现. 1 public class WaitNotifyBroker<T> implements Broker&

JAVA多线程之生产者消费者

生产者消费者并发编程: 假设仓库有10个仓位,分别有10个生产者和10个消费者,生产者不断生产产品,放入仓库的仓位中,而消费者则不断从仓库中获取产品, 如果仓库已满,则生产者要等待,等消费者消费后,空出仓位后,再继续放入产品. 反之如果仓库已空,则消费者要等待,等待生产者生产出产品后,再继续消费产品. 关于生产者.消费者有四种实现方式 1,wait,nofity方式 2,ReentrantLock锁的await()和signal() 3,阻塞队列的方式 4,Semaphore 信号量方式 下面分

java多线程解决生产者消费者问题

import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class Test { public static void main(String[] args) { GunClip clip = new GunClip(); Producer p = new Producer(clip); customer c = new customer(clip); p.star

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库 //批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产者不停的生产产品并放入数量有限的指定槽内,而消费者从指定槽依次取出产品,现实中的流水车间也相似于此. publ

java wait notifyAll 生产者 消费者 BlockingDeque

--用wait notifyAll来实现生产者与消费者模式,如下 package com.collonn.procon2; import java.util.LinkedList; import java.util.concurrent.atomic.AtomicInteger; public class PCTest { // the max number of product in product pool public static final int QUEUE_MAX_SIZE = 3

java模拟实现生产者---消费者问题

本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源:http://blog.csdn.net/u012116457 已知技术参数: 生产者消费者问题,描述一组生产者向一组消费者提供产品/消息.它们共享一个有界缓冲区,生产者向其中放产品/消息,消费者从中取产品/消息.只要缓冲区未满,生产者可放产品/消息,只要缓冲区有数据,消费者可取消息.即应满足下列二个同步条件: 1.只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取消息,否则消费者必须等待. 2.只有缓冲池中至少有一个缓冲