模拟生产者与消费者问题可视化java代码

代码如下

TheadProcess类

package com.jiang;

import javax.swing.*;

public class ThreadProcess {
    
    
    public static void main(String[] args) {
    
    
        MainFrame mainFrame = new MainFrame();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//框架关闭时退出程序
    }
}

Task类

package com.jiang;

public class Task {
    
    
    public int x;
    public int y;
    public Task(int x,int y){
    
    
        this.x=x;
        this.y=y;
    }
    public int getx(){
    
     return x; }
    public int gety(){
    
     return y; }
}

MainFrame类

package com.jiang;

import javax.swing.*;
import java.awt.*;
import java.util.LinkedList;

public class MainFrame extends JFrame {
    
    
    public int max_size = 3;
    public LinkedList<JLabel> list = new LinkedList<JLabel>();

    public static Buffer buffer ;
    public static ConPanel conPanel;
    public static ProPanel proPanel;
    public MainFrame(){
    
    
        super("消费者和生产者的并发进程");
        buffer = new Buffer(max_size,list);
        proPanel = new ProPanel(max_size,buffer);
        conPanel = new ConPanel(max_size,buffer);
        setSize(850,500);
        setLocationRelativeTo(null);//把窗口位置设置到屏幕中心
        Container container=this.getContentPane();
        GridLayout gridLayout=new GridLayout(3,1);
        container.setLayout(gridLayout);
        container.add(proPanel);
        container.add(buffer);
        container.add(conPanel);
        setVisible(true);
    }
}

Buffer类

package com.jiang;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.util.LinkedList;

public class Buffer extends JPanel {
    
    
    public final int MAX_SIZE ;
    public LinkedList<JLabel> list ;
//    public JLabel label;
    public Buffer(int MAX_SIZE,LinkedList<JLabel> list){
    
    
        this.MAX_SIZE = MAX_SIZE;
        this.list = list;

        setLayout(null);
        setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK,2),
                "仓库", TitledBorder.CENTER, TitledBorder.TOP,new Font("微软雅黑", Font.BOLD, 20)));
        setBackground(new Color(199, 190, 24));
        setVisible(true);
    }
    public synchronized void produce(){
    
    
        while(list.size()==MAX_SIZE){
    
    
            try{
    
    
                wait();
            }catch (Exception e){
    
    
                e.printStackTrace();
            }
        }
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\jianglinnana\\Desktop\\1.png");
        JLabel label = new JLabel(imageIcon);
        label.setBounds(10+list.size()*100,30,90,90);
        this.add(label);
        list.add(label);
        notifyAll();
    }
    public synchronized void consumer(){
    
    
        while(list.isEmpty()){
    
    
            try{
    
    
                wait();
            }catch (Exception e){
    
    
                e.printStackTrace();
            }
        }
        remove(list.getLast());
        list.remove(list.getLast());
        notifyAll();
    }

}

ProPanel类

package com.jiang;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

public class ProPanel extends JPanel {
    
    
    JButton start = new JButton("开始生产");
    JButton stop = new JButton("停止生产");
    public static Task task;
    public Producering producering ;
    public Buffer buffer;
    public int max_size;
    @Override
    public void paint(Graphics g) {
    
    
        super.paint(g);
        try {
    
    
            Image image = ImageIO.read(new File("C:\\Users\\jianglinnana\\Desktop\\1.png"));
            g.drawImage(image,task.x,task.y,90,90,this);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

    }
    public ProPanel(int max_size,Buffer buffer){
    
    
        this.max_size = max_size;
        this.buffer = buffer;
        setLayout(null);
        setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK,2),
                "生产者", TitledBorder.CENTER, TitledBorder.TOP,new Font("微软雅黑", Font.BOLD, 20)));
        setBackground(new Color(22, 210, 188));
        start.setBounds(700,25,100,50);
        stop.setBounds(700,85,100,50);
        task = new Task(10,30);
        producering = new Producering(this,task,max_size,buffer);
        add(start);
        add(stop);
        setVisible(true);
        start.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                Producering.signal_Pro=true;
                producering.start();
            }
        });
        stop.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                Producering.signal_Pro=false;

            }
        });
    }
}

Producering类

package com.jiang;

import javax.swing.*;
import java.sql.ClientInfoStatus;
import java.util.Random;

public class Producering extends Thread{
    
    
//    public static boolean flag = false;
    public ProPanel proPanel;
    public Task task;
//    public Producer producer;
    private int max_size ;
    private Buffer buffer ;
    public static boolean signal_Pro = false;

    public Producering(ProPanel proPanel,Task task,int max_size,Buffer buffer){
    
    
        this.proPanel=proPanel;
        this.task=task;
        this.max_size = max_size;
        this.buffer = buffer;
//        this.producer=producer;
    }
    @Override
    public void run(){
    
    
        while (true) {
    
    
//            System.out.println(signal_Pro);
            if(signal_Pro==false||buffer.list.size()==buffer.MAX_SIZE){
    
    
                try {
    
    
                    wait();
                }catch (Exception e){
    
    
                    e.printStackTrace();
                }
            }else {
    
    
                if (task.x <= 600) {
    
    
                    task.x += 30;
                    proPanel.repaint();
                    try {
    
    
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                } else {
    
    
                    buffer.produce();
                    buffer.repaint();
                    task.x = 10;
                    proPanel.repaint();
                    System.out.println("pro:" + buffer.list.size());
                }
            }
        }
    }
}

ConPanel类

package com.jiang;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

public class ConPanel extends JPanel {
    
    
    JButton start = new JButton("开始消费");
    JButton stop = new JButton("停止消费");
    public static Task task;
    public Consumering consumering;
    public Buffer buffer;
    public int max_size;
    @Override
    public void paint(Graphics g) {
    
    
        super.paint(g);
        try{
    
    
            Image image = ImageIO.read(new File("C:\\Users\\jianglinnana\\Desktop\\1.png"));
            g.drawImage(image,task.x,task.y,90,90,this);
        }catch (IOException e){
    
    
            e.printStackTrace();
        }
    }
    public ConPanel(int max_size,Buffer buffer){
    
    
        this.max_size = max_size;
        this.buffer = buffer;

        setLayout(null);
        setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK,2),
                "消费者", TitledBorder.CENTER, TitledBorder.TOP,new Font("微软雅黑", Font.BOLD, 20)));
        setBackground(new Color(210, 27, 27));
        start.setBounds(700,25,100,50);
        stop.setBounds(700,85,100,50);
        task = new Task(10,30);
        consumering = new Consumering(this,task,max_size,buffer);
        add(start);
        add(stop);
        setVisible(true);
        start.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                Consumering.signal_Con=true;
                consumering.start();
            }
        });
        stop.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                Consumering.signal_Con=false;
            }
        });
    }

}

Consumering类

package com.jiang;

import javax.swing.*;

public class Consumering extends Thread {
    
    
//    public static boolean flag = false;
    public ConPanel conPanel;
    public Task task;
    private int max_size;
    private Buffer buffer;
    public static boolean signal_Con = false;

    public Consumering(ConPanel conPanel,Task task,int max_size,Buffer buffer){
    
    
        this.conPanel = conPanel;
        this.task = task;
        this.max_size = max_size;
        this.buffer = buffer;
    }

    @Override
    public void run(){
    
    
        while(true){
    
    
            if(signal_Con==false||buffer.list.size()==0){
    
    
                try {
    
    
                    wait();
                }catch (Exception e){
    
    
                    e.printStackTrace();
                }
            }
            else {
    
    

                if (task.x <= 600) {
    
    
                    task.x += 30;
                    conPanel.repaint();
                    try {
    
    
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                } else {
    
    
                    task.x = 10;
                    buffer.repaint();
                    conPanel.repaint();
                    buffer.consumer();
                    System.out.println("con:" + buffer.list.size());
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44833380/article/details/109432330