• 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)肯定还会有资源数据出错的问题,继续学习

  • 相关阅读:
    第五章 数据的共享与保护
    实验6
    实验5
    实验4 类与对象2)
    实验三 类与对象
    实验2
    2018—3-21第二章程序例题(2)
    第二章思维导图
    2018—3-18C++第二章程序例题
    汇编实验九
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/5056672.html
Copyright © 2020-2023  润新知