zoukankan      html  css  js  c++  java
  • classic problem: producer and consumer

    注意: 1. wait()后 立即放锁, 给其他等待线程使用,当被唤醒,立即从wait()处执行(而不是从方法头重新执行)

              2. notify(), 唤醒其他睡着的线程,不能唤醒自己。

              3. 没有结束的问题用 while(用if, 则可能在错误情况下继续执行)。

    public class ProducerConsumer {
        public static void main(String[] args) {
            SyncStack ss = new SyncStack();
           
            Producer p = new Producer(ss);
            Consumer c = new Consumer(ss);
           
            new Thread(c).start();
            new Thread(p).start();
            new Thread(p).start();
            new Thread(p).start();
        }
    }

    class Wotou {
        int id;
       
        Wotou(int id) {
            this.id = id;
        }
       
        public String toString() {
            return "Wotou: " + id;
        }
    }

    class SyncStack {
        int index = 0;
        //Wotou[] wotou = new Wotou[6];
       
        public synchronized void push(/*Wotou wt,*/ int i) {       
            while (index == 6) {
                System.out.println("----push(Wotou wt):" + index);
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }           
            }

            this.notify();
            System.out.println(Thread.currentThread().getName() + "-----producer: " + i );
            //wotou[index] = wt;
            index++;
        }
       
        public synchronized int pop(int i) {
            System.out.println("pop(: " + i);
            while (index == 0) {
                System.out.println("pop():" + index);
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }           
            }

            System.out.println("pre this.notify()");
            this.notify();
            System.out.println("end this.notify()");
           
            index--;
            System.out.println("Consumer: " + i);
            return index;
            //return wotou[index];
        }
    }

    class Producer implements Runnable{
        SyncStack ss;
       
        Producer(SyncStack ss) {
            this.ss = ss;
        }
       
        @Override
        public void run() {
            // TODO Auto-generated method stub
            for (int i=0; i<10; i++){
                Wotou wt = new Wotou(i);
                ss.push(/*wt,*/ i);
                           
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ie){
                    ie.printStackTrace();
                }
            }   
        }
    }

    class Consumer implements Runnable{
        SyncStack ss;
       
        Consumer(SyncStack ss) {
            this.ss = ss;
        }
       
        @Override
        public void run() {
            // TODO Auto-generated method stub
            for (int i=0; i<30; i++){
                ss.pop(i);
               
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ie){
                    ie.printStackTrace();
                }
            }   
        }
    }

  • 相关阅读:
    formData实现图片上传
    input[type='file']样式美化及实现图片预览
    第一个Vue插件从封装到发布
    lastIndex对正则结果的影响
    使用图片地图减少HTTP请求数量
    实现文字颜色渐变
    vue-cli中如何引入jquery
    事件处理详解
    图片载入状态判断及实现百分比效果loading
    页面加载时触发的事件及顺序
  • 原文地址:https://www.cnblogs.com/tiechui/p/1893600.html
Copyright © 2011-2022 走看看