zoukankan      html  css  js  c++  java
  • java线程---生产者与消费者,同步问题

    package com.thread.sync;
    
    class common {//同步资源池
        private char ch; //****资源池公用资源***
        private boolean available=false;//默认等待生产数据
        synchronized char get(){//定义同步资源方法,消费者使用
            while (available==false)//当资源没有生产的时候,一直等待,当available==false时,条件为**"真"**,执行while,里面wait实现 等待
                try {
                    wait(); //等待
                } catch (Exception e){}
            available=false;
            return ch;
        }
        
        synchronized void put(char newch){//生产者将要使用其生产数据
            while(available==true)//当available==true时,条件依然为**真**,内部也是等待生产者将数据放入,也就是说while无论是在get方法还是这里,都是作为线程等待 数据判断的依据,也就可以理解在synchronized声明的方法中,其实是同步进行的。
                                  //即等待和后续其实都是在进行的,而他等待的是”多线程“来放入数据或者拿取数据
                try {
                    wait();
                } catch (InterruptedException e) {}
            ch=newch;
            available=true;//标记,”告诉别人可以取值 了,或者消费了,我有产品了“
            notify();//唤醒消费者线程
        }
    }
    
    
    //生产者
    class producer extends Thread{
        private common comm;  //同步资源类
        public producer(common thiscomm){
            comm = thiscomm;//指向同步资源类
        }
        @Override
        public void run() {
            char c;
            for (c='a';c<='e';c++) {
                System.out.println("生产者生产了数据"+c);
                comm.put(c);
            }
        }
    }
    
    class consumer extends Thread{
        private common comm;//同步资源类
        public consumer(common thiscomm){
            comm = thiscomm;//指向同步资源类
        }
        @Override
        public void run() {
            char c;
            for (int i = 0; i < 5; i++) {
                c = comm.get();
                System.out.println("消费者得到的数据"+c);
            }
            
        }    
    }
    
    //消费者,从生产者和消费者类来看,他们都共同使用同步资源类,同时构造方法指向同步资源,并且他们共同操作同步资源数据
    //消费者和生产者都继承了Thread类,并覆盖了run方法,一个用来生产数据,一个消费数据
    //生产者与消费者,"同步资源池";生产者生产数据,放入资源池;消费者消费数据,使用资源池;主程序new并实现
    public class ThreadSync {
        public static void main(String[] args) {
            common comm = new common();
            producer p = new producer(comm);
            consumer c = new consumer(comm);//一个生产,多个消费
            consumer c1 = new consumer(comm);
            p.start();c.start();c1.start();
        }
    }
    View Code
  • 相关阅读:
    c#泛型的使用
    如何调试由于heap corruption导致的程序崩溃的简单示例
    Windows的SEH机理简要介绍
    利用定制行为扩展WCF之利用MessageInsepctor behaviourExtension扩展WCF行为(自定义消息头)
    欧拉函数
    JZOJ.1349 最小公约数
    关于扩展中国剩余定理(excrt)的证明与拙见
    【USACO 2021 US Open, Gold】United Cows of Farmer John & JZOJ7220
    线性求逆元
    【USACO 2021 January Contest, Platinum】Problem 1. Sum of Distances JZOJ.7241
  • 原文地址:https://www.cnblogs.com/ciscolee/p/12994727.html
Copyright © 2011-2022 走看看