首页 > 其他分享 >线程通信问题分解2

线程通信问题分解2

时间:2022-12-23 17:22:55浏览次数:26  
标签:Product String void brand 通信 分解 线程 public name

【1】利用同步代码块解决问题

package com.msb.test10;

import com.sun.media.sound.RIFFInvalidDataException;

/**
 * @author : liu
 * 日期:16:02:52
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class CustomerThread extends Thread{//消费者线程
    //共享商品资源
    private Product p;

    public CustomerThread(Product p) {
        this.p = p;
    }

    @Override
    public  void run() {
        synchronized (p){
            for (int i = 1; i <= 10 ; i++) {//消费次数
                System.out.println("消费者消费了:"+ p.getBrand()+"---"+ p.getName());
            }
        }

    }
}
package com.msb.test10;

/**
 * @author : liu
 * 日期:15:45:09
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class ProducerThread extends Thread{//生产者线程
    //共享商品
    private Product p;

    public ProducerThread(Product p) {
        this.p = p;
    }
    @Override
    public void run() {
        synchronized(p){
            for (int i = 1; i <= 10; i++) {//生产十个商品
                if(i%2==0){
                    //生产费列罗巧克力
                    p.setBrand("费列罗");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    p.setName("巧克力");
                }else{
                    p.setBrand("哈尔滨");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    p.setName("啤酒");
                    }
                System.out.println("生产者生产了:"+p.getBrand() + "---"+ p.getName());
            }
        }

    }
}

【2】利用同步方法解决问题

package com.msb.test11;

/**
 * @author : liu
 * 日期:15:42:06
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Product {//商品类
    //品牌
    private String brand;
    //名字
    private String name;
    //setter,getter方法:
    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //生产商品
    public synchronized void setProduct(String brand ,String name){
            this.setBrand(brand);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.setName(name);
        System.out.println("生产者生产了:"+this.getBrand() + "---"+ this.getName());
    }
    //消费商品
    public synchronized void getProduct(){
        System.out.println("消费者消费了:"+ this.getBrand()+"---"+ this.getName());
    }
}
package com.msb.test11;

/**
 * @author : liu
 * 日期:15:45:09
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class ProducerThread extends Thread{//生产者线程
    //共享商品
    private Product p;

    public ProducerThread(Product p) {
        this.p = p;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {//生产十个商品
            if (i%2==0){
                p.setProduct("费列罗","巧克力");
            }else{
                p.setProduct("哈尔滨","啤酒");
            }
        }
    }
}
package com.msb.test11;

/**
 * @author : liu
 * 日期:16:02:52
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class CustomerThread extends Thread{//消费者线程
    //共享商品资源
    private Product p;

    public CustomerThread(Product p) {
        this.p = p;
    }

    @Override
    public  void run() {
        synchronized (p){
            for (int i = 1; i <= 10 ; i++) {//消费次数
                p.getProduct();
            }
        }

    }
}

 

标签:Product,String,void,brand,通信,分解,线程,public,name
From: https://www.cnblogs.com/jeldp/p/17001147.html

相关文章

  • Java中线程的6种状态详解
    java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。publicenumState{NEW,RUNNABLE,......
  • 线程通信问题分解1
    packagecom.msb.test10;/***@author:liu*日期:15:42:06*描述:IntelliJIDEA*版本:1.0*/publicclassProduct{//商品类//品牌privateStr......
  • 线程通信问题 引入
    应用场景:生产者和消费者问题假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费如果仓库中没有产品,则生产者将产品放入仓库,否则停止......
  • java线程池原理
    内容:  1、什么是线程池      2、线程池的优点      3、java线程池原理(重点)      4、理解java线程池(重点)      5、......
  • 线程同步的优缺点
    【1】对比:线程安全效率低线程不安全,效率高【2】可能造成死锁死锁》不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死......
  • 生产事故-错误密钥引发的接口通信问题
    入职多年,面对生产环境,尽管都是小心翼翼,慎之又慎,还是难免捅出篓子。轻则满头大汗,面红耳赤。重则系统停摆,损失资金。每一个生产事故的背后,都是宝贵的经验和教训,都是项目成员......
  • m无线通信信道matlab仿真,包括自由空间损耗模型,Okumura-Hata模型,COST231 Hata模型,SU
    1.算法概述无线信道是移动通信的传输媒体,所有的信息都在这个信道中传输。信道性能的好坏直接决定着人们通信的质量,因此要想在有限的频谱资源上尽可能地高质量、大容量传输......
  • m无线通信信道matlab仿真,包括自由空间损耗模型,Okumura-Hata模型,COST231 Hata模型,SU
    1.算法概述        无线信道是移动通信的传输媒体,所有的信息都在这个信道中传输。信道性能的好坏直接决定着人们通信的质量,因此要想在有限的频谱资源上尽可能地高......
  • C# 中如何判断线程是否结束_manok_新浪博客
       为了测试获取网页源码,使用C#编写程序,为了最大限度的增加获取的次数,于是采用了多线程的方式,C#中很容易实现多线程,其实现方式与Java的实现方式基本一样,但是在功能上......
  • C# 中如何判断线程是否结束
       为了测试获取网页源码,使用C#编写程序,为了最大限度的增加获取的次数,于是采用了多线程的方式,C#中很容易实现多线程,其实现方式与Java的实现方式基本一样,但是在功能上......