同步代码块如何进行同步(线程)

    xiaoxiao2021-08-15  149

    package cn.java;

    public class RunnableDemo4 {

    public static void main(String[] args) { Produce p = new Produce(); Productor pr = new Productor(p); Saler s = new Saler(p); Thread th1 = new Thread(pr); Thread th2 = new Thread(s); th1.start(); th2.start(); }

    } //产品 class Produce{ private int id; private String name; private boolean flag = false;

    public Produce() { } public Produce(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; }

    } //生产者 class Productor implements Runnable{ private Produce p; private int pid=1;

    public Productor(Produce p) { this.p = p; } @Override public void run() { //负责生产 while(true){ synchronized (p) { if(p.isFlag()){ //不生产产品 //Thread.sleep(200);//sleep只释放cpu不释放锁 try { p.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ p.setId(pid++); p.setName("小钢炮"); System.out.println("生产:"+p.getName()+p.getId()); p.setFlag(true); p.notify(); } } } }

    } //销售者

    class Saler implements Runnable{ private Produce p;

    public Saler(Produce p) { this.p = p; } @Override public void run() { while(true){ synchronized (p) { if(!p.isFlag()){ //没有可销售的产品 try { p.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println("卖:"+p.getName()+p.getId()); p.setFlag(false); p.notify();//唤醒一个线程 } } } }

    }

    转载请注明原文地址: https://ju.6miu.com/read-676411.html

    最新回复(0)