用JAVA方法实现操作系统的PV操作
绪
你好! 本人在这方面是一个初学者,想通过发布博客整理思绪,如果您对我的博客有些地方有不同见解,欢迎私信
思路
-
在这个操作的实现上,首先要理清逻辑,理清楚在什么情况下发生什么应该进行什么操作;
-
将产品 i 设置成一个公共资源,初值为0;
-
先来分析一下生产者,后面分析消费者
-
1、当产品 i 的数量没有达到缓冲区的最大值时,每一个生产者生产一次,将产品放入缓冲区,产品 i 数量 +1;此时消费者消费产品,在缓冲区中的第一个产品被消费,产品 i 数量 -1;
-
2、当产品 i 达到缓冲区的最大值之后,生产者再次生产,该生产者就会进入生产者阻塞队列,产品 i 数量 +1;相应的表现就是在生产者阻塞队列中的生产者不能生产产品;此时消费者消费产品,在缓冲区中的第一个产品被消费,阻塞队列中的第一个生产者生产的产品被放到缓冲区的最后一位并且该生产者可以再次生产产品,产品 i 数量 -1;
-
3、当生产者阻塞队列满,所有生产者都不能再生产产品,全部阻塞,产品 i 数量 +1;此时消费者消费产品,在缓冲区中的第一个产品被消费,阻塞队列中的第一个生产者生产的产品被放到缓冲区的最后一位并且除仍阻塞在生产者阻塞队中的生产者,全部生产者都可以再次生产产品,产品 i 数量 -1;
-
4、当消费者阻塞队列有信息时(出现这种情况见下面第5条,此时产品数量在抽象意义上为负数),生产者生产的产品要先去供消费者消费,简单来说就是要先消除消费者在阻塞队列中的信息,才能够在缓冲区放生产者生产的产品;此时生产者生产产品,在消费者阻塞队列中的第一个消费者会得到消费,产品 i 数量 +1,;此时消费者消费,消费者阻塞队列中就会增加一个等待消费的消费者,产品 i 数量 -1,直到消费者阻塞队列满,所有消费者算不阻塞;
-
5、当 i 为 0 时候(缓冲区和生产者阻塞队列都没有产品),消费者来消费产品,就会进入消费者阻塞队列,产品 i 数量 -1;
插入一段漂亮的java实现的PV操作代码片
复制粘贴注意自己调整缩进`
import java.awt.Color;
import java.awt.Container;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
*
* @author 彭可爱
* 时间:2020年11月9日11:12:19
*
*/
public class Procon {
static int i = 0;
public static void main(String[] args) {
JFrame jf = new JFrame("生产者与消费者关系");
//设置关闭方式
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小
jf.setSize(900, 900);
//设置居中
jf.setLocationRelativeTo(null);
//设置顶层容器
Container con = jf.getContentPane();
//设置面板
JPanel jp = new JPanel();
//
Panel pa = new Panel();
//设置窗口布局
jp.setLayout(null);
//将面板放到窗体
jf.add(pa);
//设置缓冲区
JLabel jl0 = new JLabel("缓冲区队列:");
jl0.setBounds(30, 30, 80, 40);
//将内容放到面板中
jp.add(jl0);
//设置框框
JTextField jt[] = new JTextField[6];
for (int i = 0; i < jt.length; i++) {
jt[i] = new JTextField(4);
jp.add(jt[i]);
}
jt[0].setBounds(140, 30, 80, 40);
jt[1].setBounds(250, 30, 80, 40);
jt[2].setBounds(360, 30, 80, 40);
jt[3].setBounds(470, 30, 80, 40);
jt[4].setBounds(580, 30, 80, 40);
jt[5].setBounds(690, 30, 80, 40);
//设置阻塞队列1(生产者阻塞队列)
JLabel jl1 = new JLabel("生产者阻塞:");
jl1.setBounds(30, 120, 80, 40);
jp.add(jl1);
JTextField jt_zuse1[] = new JTextField[9];
for (int i = 6; i < 9; i++) {
jt_zuse1[i] = new JTextField(4);
jp.add(jt_zuse1[i]);
}
jt_zuse1[6].setBounds(140, 120, 80, 40);
jt_zuse1[7].setBounds(250, 120, 80, 40);
jt_zuse1[8].setBounds(360, 120, 80, 40);
//设置阻塞队列2(消费者阻塞队列)
JLabel jl2 = new JLabel("消费者阻塞:");
jl2.setBounds(470, 120, 80, 40);
jp.add(jl2);
JTextField jt_zuse2[] = new JTextField[2];
for (int i = 0; i < jt_zuse2.length; i++) {
jt_zuse2[i] = new JTextField(4);
jp.add(jt_zuse2[i]);
}
jt_zuse2[0].setBounds(580, 120, 80, 40);
jt_zuse2[1].setBounds(690, 120, 80, 40);
//生产者按钮
JButton jb1[] = new JButton[5];
for(int j = 0;j < 5;j ++) {
jb1[j] = new JButton("生产者"+j);
jb1[j].setBackground(Color.yellow);
jb1[j].setBounds(j*100+180, 250, 80, 40);
jb1[j].setBorder(BorderFactory.createLoweredBevelBorder());
jp.add(jb1[j]);
}
//消费者按钮
JButton jb2[] = new JButton[5];
for(int j = 0;j < 5;j ++) {
jb2[j] = new JButton("消费者"+j);
jb2[j].setBackground(Color.pink);
jb2[j].setBounds(j*100+180, 350, 80, 40);
jb2[j].setBorder(BorderFactory.createLoweredBevelBorder());
jp.add(jb2[j]);
}
//加"生产者0"按钮的监听器
jb1[0].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(i >=0 && i < 6) {
jt[i].setText("生产者0");
i++;
}else if(i >= 6 && i <9) {
jt_zuse1[i].setText("生产者0");
jb1[0].setEnabled(false);
i++;
}else if(i == -1) {
for(int j = 0;j<5;j++) {
if(jt_zuse2[-i-1].getText().equals(jb2[j].getText())) {
jb2[j].setEnabled(true);
}
}
jt_zuse2[-i-1