代码如下
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());
}
}
}
}
}