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
  • 相关阅读:
    第十八周个人作业
    十六周个人作业
    个人作业
    第十四周总结
    第十三周周末总结
    排球计分程序说明书
    我和计算机
    排球比赛记分员
    逻辑思维怎样成为一个高手
    用户故事排球教练助手
  • 原文地址:https://www.cnblogs.com/ciscolee/p/12994727.html
Copyright © 2011-2022 走看看