mayu1020 2021-07-30 19:56 采纳率: 0%
浏览 11
已结题

关于Java多线程的问题?


package edu.uestc.avatar.demo;

import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test3 {
    private static MyStack stack = new MyStack();

    private static class Clerk {
        private String name;

        public Clerk() {
            this.name = "a" + (int) (Math.random() * 10 + 1);
        }

        @Override
        public String toString() {
            return name;
        }
    }

    private static class MyStack {
        private static final int CAPCITY = 10;
        private LinkedList<Clerk> list = new LinkedList<>();
        private Lock lock = new ReentrantLock();
        private Condition notFull = lock.newCondition();
        private Condition notEmpty = lock.newCondition();

        // 进栈
        public void push(Clerk clerk) {
            lock.lock();
            try {
                while (list.size() == CAPCITY) {
                    System.out.println("缓冲区已满,等待notFull");
                    notFull.await();
                }
                list.addFirst(clerk);
                notEmpty.signal();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }

        // 出栈
        public Clerk pop() {
            Clerk clerk = null;
            lock.lock();
            try {
                while (list.isEmpty()) {
                    System.out.println("缓冲区没有数据,等待notEmpty");
                    notEmpty.await();
                }
                clerk = list.removeFirst();
                notFull.signal();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
            return clerk;
        }

        public int size() {
            return list.size();
        }
        
    }
    private static class Producer implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    Clerk clerk = new Clerk();
                    stack.push(clerk);
                    System.out.println("添加" + clerk + "成功!集合中还有" + stack.size() + "个");
                    Thread.sleep((int) (Math.random() * 1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static class Consumer implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    Clerk clerk = stack.pop();
                    System.out.println("删除" + clerk + "成功!集合中还有" + stack.size() + "个");
                    Thread.sleep((int) (Math.random()) * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool();
        executor.execute(new Producer());
        executor.execute(new Consumer());
    }
}

//运行不出来后续的个数,一直在0,1之间反复横跳。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 8月7日
    • 创建了问题 7月30日

    悬赏问题

    • ¥15 angular项目错误
    • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
    • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
    • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
    • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
    • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
    • ¥200 csgo2的viewmatrix值是否还有别的获取方式
    • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
    • ¥15 请把下列每一行代码完整地读懂并注释出来
    • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件