• 使用线程实现多生产者,多消费者demo


      1 package com.woniuxy.test2;
      2 
      3 import java.util.Arrays;
      4 
      5 /**
      6  * @author wuwenjun
      7  * @time 2020/11/12/21:07:41
      8  */
      9 //
     10 class Product{
     11     private String[] strs = "☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆".split(" ");
     12 
     13     private int i;
     14 
     15     public void put(){//加锁,防止放入时被抢走。
     16         synchronized (this) {
     17             while(i==strs.length){//当为最大时等待
     18                 try {
     19                     this.wait();
     20                 } catch (InterruptedException e) {
     21                     e.printStackTrace();
     22                 }
     23             }
     24 
     25             strs[i++] = "★";
     26             System.out.println(Thread.currentThread().getName()+"放入:"+this);
     27             this.notifyAll();//只要放入后就唤醒其它线程
     28         }
     29     }
     30 
     31     public void get(){//加锁,防止取出时被被抢走中断。
     32         synchronized (this) {
     33             while(i==0){//当没有星星时,就等待
     34                 try {
     35                     this.wait();
     36                 } catch (InterruptedException e) {
     37                     e.printStackTrace();
     38                 }
     39             }
     40             //星星-1
     41             strs[--i] = "☆";
     42             System.out.println(Thread.currentThread().getName()+"取出:"+this);
     43             this.notifyAll();//只要取出后,就唤醒其它线程
     44         }
     45     }
     46 
     47     @Override
     48     public String toString() {
     49         return Arrays.toString(strs);
     50     }
     51 }
     52 
     53 class Shop implements Runnable{
     54 
     55     private Product product;
     56 
     57     public Shop(Product product) {
     58         this.product = product;
     59     }
     60 
     61     @Override
     62     public void run() {
     63         synchronized (this) {
     64             while (true) {//不断的取
     65                 product.put();
     66             }
     67         }
     68     }
     69 }
     70 
     71 class Consumer implements Runnable{
     72 
     73     private Product product;
     74 
     75     public Consumer(Product product) {
     76         this.product = product;
     77     }
     78 
     79     @Override
     80     public void run() {
     81 
     82         synchronized (this) {
     83             while (true) {
     84                 product.get();
     85             }
     86         }
     87     }
     88 }
     89 
     90 
     91 public class ShopConsumer {
     92     public static void main(String[] args) {
     93         Product product = new Product();//共用的第三方对象
     94 
     95         Shop shop = new Shop(product);
     96         Consumer consumer = new Consumer(product);
     97 
     98         Thread th = new Thread(shop,"商家1");
     99         Thread th2 = new Thread(consumer,"用户1");
    100         Thread th3 = new Thread(shop,"商家2");
    101         Thread th4 = new Thread(consumer,"用户2");
    102 
    103         th.start();
    104         th2.start();
    105         th3.start();
    106         th4.start();
    107 
    108     }
    109 }
  • 相关阅读:
    SQL找出和删除一个表的重复记录
    "The state information is invalid for this page and might be corrupted"错误的一个解决办法
    优雅还不够,简洁才高效!——用NValidator一句话搞定客户端检测
    HTTP 错误 404 文件或目录未找到 HTTP 错误 401.2 未经授权:访问由于服务器配置被拒绝。
    来自微软关于异常处理的17条军规
    SQL回滚Transaction来调试SQL语句
    MyXls初级教程
    SQL常用判断检测语句
    纯CSS实现底部固定漂浮导航
    一个仿PetShop的通用DBHelper类
  • 原文地址:https://www.cnblogs.com/hello-top/p/13966582.html
Copyright © 2020-2023  润新知