操作系统课程设计—多进程同步橘子苹果问题源代码.doc_第1页
操作系统课程设计—多进程同步橘子苹果问题源代码.doc_第2页
操作系统课程设计—多进程同步橘子苹果问题源代码.doc_第3页
操作系统课程设计—多进程同步橘子苹果问题源代码.doc_第4页
操作系统课程设计—多进程同步橘子苹果问题源代码.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.awt.*;import .MalformedURLException;import java.util.ArrayList;import javax.print.attribute.AttributeSet;import javax.swing.*;import org.w3c.dom.css.Rect;public class Apple/* * 生成一个缓冲池类对应的对象叫myStorage,以后所有的生产者线程 和消费者线程都对这个myStorage对象进行操作! */ static MyStorage myStorage = new MyStorage();private JFrame window ;/ 该数组用来存取生产橘子和苹果的线程,分别20个static Increaseapple appleincrease = new Increaseapple20;static Increaseorange orangeincrease = new Increaseorange20;/ 该数组用来存放消费者线程,最多20个static Decreaseapple appledecrease = new Decreaseapple20;static Decreaseorange orangedecrease = new Decreaseorange20;/ 代表两个生产者对应线程的数目,i1为苹果,i2为橘子static int i1 = 0;static int i2 = 0;/ 代表消费者对应线程的数目,d1为苹果,d2为橘子static int d1 = 0;static int d2 = 0;static TextArea textArea1;static TextArea textArea2;static JProgressBar progressbar = new JProgressBar(0,20);static Draw draw1; static JTextField t1;static JTextField t2;static JTextField t3;static JTextField t4;public void createMainWindow()window = new JFrame(橘子苹果问题);window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);window.setSize(700,700);window.setResizable(false);JPanel panel = new JPanel();panel.setLayout(null);JLabel App1 = new JLabel(生产苹果者数:);App1.setBounds(10, 500,100,25);panel.add(App1);progressbar.setStringPainted(true);progressbar.setBounds(200,640,300,30);panel.add(progressbar);progress p = new progress(myStorage);p.start();draw1 = new Draw(myStorage);draw1.setBounds(0,0,700,300);panel.add(draw1);t1 = new JTextField();t1.setBounds(120,500,60,25);t1.addKeyListener(new KeyAdapter()public void keyTyped(KeyEvent event)char ch = event.getKeyChar();if (ch 9)event.consume(););panel.add(t1);JButton inapp1 = new JButton(增加);inapp1.setBounds(190, 500, 60, 25);panel.add(inapp1);inapp1.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)if (i1 0)decreaseappleProducer();t1.setText(String.valueOf(i1););JLabel Org1 = new JLabel(生产橘子者数:);Org1.setBounds(10, 550,100,25);panel.add(Org1);t2 = new JTextField();t2.setBounds(120,550,60,25);t2.addKeyListener(new KeyAdapter()public void keyTyped(KeyEvent event)char ch = event.getKeyChar();if (ch 9)event.consume(););panel.add(t2);JButton inorg1 = new JButton(增加);inorg1.setBounds(190, 550, 60, 25);panel.add(inorg1);inorg1.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)if (i2 0)decreaseorangeProducer();t2.setText(String.valueOf(i2););/*消费者的数目设置 苹果核橘子*/JLabel App2 = new JLabel(消费苹果者数:);App2.setBounds(330,500,100,25);panel.add(App2);t3 = new JTextField();t3.setBounds(440,500, 60, 25);panel.add(t3);JButton inapp2 = new JButton(增加);inapp2.setBounds(510,500, 60, 25);panel.add(inapp2);inapp2.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)if (d1 0)decreaseappleConsumer();t3.setText(String.valueOf(d1););JLabel Org2 = new JLabel(消费橘子者数:);Org2.setBounds(330,550,100,25);panel.add(Org2);t4 = new JTextField();t4.setBounds(440,550, 60, 25);panel.add(t4);JButton inorg2 = new JButton(增加);inorg2.setBounds(510,550, 60, 25);panel.add(inorg2);inorg2.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)if (d2 0)decreaseorangeConsumer();t4.setText(String.valueOf(d2););/* * 这里的代码是实现了设计要求中的第三条:生产者速度可调。 */JLabel appsp1 = new JLabel(苹果生产速度:);appsp1.setBounds(10,400,100,25);panel.add(appsp1);final JTextField tsp1 = new JTextField();tsp1.setBounds(120, 400, 60, 25);tsp1.setText(String.valueOf(Increaseapple.speed);tsp1.addKeyListener(new KeyAdapter()public void keyTyped(KeyEvent event)char ch = event.getKeyChar();if (ch 9)event.consume(););panel.add(tsp1);JButton appalter1 = new JButton(修改);appalter1.setBounds(190, 400, 60, 25);panel.add(appalter1);/ 在这里实现了控制生产速度的功能appalter1.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)String str1 = tsp1.getText();long i = Long.parseLong(str1);if (i = 0)Increaseapple.speed = i;else if (i 0)Increaseapple.speed = 0;tsp1.setText(String.valueOf(Increaseapple.speed);elseIncreaseapple.speed = 10000;tsp1.setText(String.valueOf(Increaseapple.speed););/* * 这里的代码是实现了设计要求中的第三条:生产者速度可调。 */JLabel orgsp1 = new JLabel(橘子生产速度:);orgsp1.setBounds(10,450,100,25);panel.add(orgsp1);final JTextField tsp2 = new JTextField();tsp2.setBounds(120, 450, 60, 25);tsp2.setText(String.valueOf(Increaseapple.speed);tsp2.addKeyListener(new KeyAdapter()public void keyTyped(KeyEvent event)char ch = event.getKeyChar();if (ch 9)event.consume(););panel.add(tsp2);JButton orgalter1 = new JButton(修改);orgalter1.setBounds(190, 450, 60, 25);panel.add(orgalter1);/ 在这里实现了控制生产速度的功能orgalter1.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)String str1 = tsp2.getText();long i = Long.parseLong(str1);if (i = 0)Increaseapple.speed = i;else if (i 0)Increaseapple.speed = 0;tsp2.setText(String.valueOf(Increaseorange.speed);elseIncreaseapple.speed = 10000;tsp2.setText(String.valueOf(Increaseorange.speed););/* * 这里的代码是实现了设计要求中的第三条:消费者速度可调。 */JLabel appsp2 = new JLabel(苹果消费速度);appsp2.setBounds(260,400, 100, 25);panel.add(appsp2);final JTextField tsp3 = new JTextField();tsp3.setBounds(370,400, 60, 25);tsp3.setText(String.valueOf(Decreaseapple.speed);tsp3.addKeyListener(new KeyAdapter()public void keyTyped(KeyEvent event)char ch = event.getKeyChar();if (ch 9)event.consume(););panel.add(tsp3);JButton appalter2 = new JButton(修改);appalter2.setBounds(440,400, 60, 25);panel.add(appalter2);/ 这里实现了控制消费速度的功能appalter2.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)String str2 = tsp3.getText();long i = Long.parseLong(str2);if (i = 0)Decreaseapple.speed = i;else if (i 0)Decreaseapple.speed = 0;tsp3.setText(String.valueOf(Decreaseapple.speed);elseDecreaseapple.speed = 10000;tsp3.setText(String.valueOf(Decreaseapple.speed););JLabel orgsp2 = new JLabel(橘子消费速度);orgsp2.setBounds(260,450,100, 25);panel.add(orgsp2);final JTextField tsp4 = new JTextField();tsp4.setBounds(370,450, 60, 25);tsp4.setText(String.valueOf(Decreaseapple.speed);tsp4.addKeyListener(new KeyAdapter()public void keyTyped(KeyEvent event)char ch = event.getKeyChar();if (ch 9)event.consume(););panel.add(tsp4);JButton orgalter2 = new JButton(修改);orgalter2.setBounds(440,450, 60, 25);panel.add(orgalter2);orgalter2.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)String str2 = tsp4.getText();long i = Long.parseLong(str2);if (i = 0)Decreaseorange.speed = i;else if (i 0)Decreaseorange.speed = 0;tsp4.setText(String.valueOf(Decreaseorange.speed);elseDecreaseorange.speed = 10000;tsp4.setText(String.valueOf(Decreaseorange.speed););/* * 这里构造了能够实现第五条要求的组件,可以显示当前线程的状态,实现了设计要求中的第五条。 */textArea2 = new TextArea();textArea2.setBounds(0,300 ,350,100);panel.add(textArea2);textArea1 = new TextArea();textArea1.setBounds(350,300,350,100);panel.add(textArea1);/* * 这里的代码实现了设计要求第六条,定义了开始,暂停,停止三个按钮,按开始按钮线程将开始执行 生产和消费。 * 可以在运行时按暂停按钮来暂停线程的生产和消费,以便查看當前線程的狀態。按停止,则所有的线程都将被强制中止执行。 */JButton start = new JButton(开始);start.setBounds(50, 600, 60, 25);panel.add(start);/ 开始按钮start.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)Increaseapple.applepause1 = 1;Decreaseapple.applepause2 = 1;Increaseorange.orangepause1 = 1;Decreaseorange.orangepause2 = 1;DrawRect rect = new DrawRect(myStorage);rect.start();t1.setText(String.valueOf(i1);t2.setText(String.valueOf(i2);t3.setText(String.valueOf(d1);t4.setText(String.valueOf(d2););JButton sus = new JButton(暂停);sus.setBounds(200,600,60,25);panel.add(sus);sus.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)textArea2.append(-n);Increaseapple.applepause1 = 0;Decreaseapple.applepause2 = 0;Increaseorange.orangepause1 = 0;Decreaseorange.orangepause2 = 0;);JButton halt = new JButton(停止);halt.setBounds(350,600, 60, 25);panel.add(halt);halt.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)for (int a = 0; a i1; a+)appleincreasea.out = true;appleincreasea = null;for (int a = 0; a i2; a+)orangeincreasea.out = true;orangeincreasea = null;for (int a = 0; a d1; a+)appledecreasea.out = true;appledecreasea = null;for (int a = 0; a d2; a+)orangedecreasea.out = true;orangedecreasea = null;i1 = 0;i2 = 0;d1 = 0;d2 = 0;t1.setText(String.valueOf(i1);t2.setText(String.valueOf(i2);t3.setText(String.valueOf(d1);t4.setText(String.valueOf(d2););JButton Ai = new JButton(人工智能);Ai.setBounds(420,600, 100, 25);Ai.addActionListener(new ActionListener()Overridepublic void actionPerformed(ActionEvent e)Decreaseorange.AI = 1;Decreaseapple.AI = 1;Increaseapple.AI = 1;Increaseorange.AI = 1;);panel.add(Ai);window.add(panel); window.setVisible(true);/* * 下面这两个方法分别是往增加、开始和减少、终止生产者线程的方法。 将线程存入生产者线程数组或从数组中移除。 * 每当调用一次该方法,就增加或减少一个生产者线程。 * * return */public static int increaseappleProducer()if(i1 20)appleincreasei1 = new Increaseapple(myStorage);appleincreasei1.start();i1+;return i1;public static int increaseorangeProducer()if(i2 0)appleincreasei1 - 1.out = true;appleincreasei1 - 1 = null;i1-;return i1;public static int decreaseorangeProducer()if(i2 0)orangeincreasei2 - 1.out = true;orangeincreasei2 - 1 = null;i2-;return i2;public static int increaseappleConsumer()if(d1 20)appledecreased1 = new Decreaseapple(myStorage);appledecreased1.start();d1+;return d1;public static int increaseorangeConsumer()if(d2 0)appledecreased1 - 1.out = true;appledecreased1 - 1 = null;d1-;return d1;public static int decreaseorangeConsumer()if(d2 0)orangedecreased2 - 1.out = true;orangedecreased2 - 1 = null;d2-;return d2;/* * main方法,程序从这里执行,执行后显示主界面。所有功能在主界面中 调节。 * * param args */public static void main(String args)Apple mainWindow = new Apple();mainWindow.createMainWindow();class Draw extends JComponentprivate MyStorage mystorage ;public Draw(MyStorage mystorage)this.mystorage = mystorage;public void paint(Graphics g)for(int i = 0 ;i 0)g.setColor(Color.BLACK);g.drawLine(MyStorage.pointapple*30+95,130,MyStorage.pointapple*30+95,100);g.drawLine(MyStorage.pointapple*30+95,130,MyStorage.pointapple*30+100,120);g.drawLine(MyStorage.pointapple*30+95,130,MyStorage.pointapple*30+90,120);if(Apple.i2 0)g.setColor(Color.BLACK);g.drawLine(MyStorage.pointorange*30+35,130,MyStorage.pointorange*30+35,100);g.drawLine(MyStorage.pointorange*30+35,130,MyStorage.pointorange*30+40,120);g.drawLine(MyStorage.pointorange*30+35,130,MyStorage.pointorange*30+30,120);g.setColor(Color.PINK);g.drawRect(50,230,40, 40);g.fillRect(51,231 ,39,39);char str = f,a,t,h,e,r;Font f = new Font(serif,Font.BOLD,36);g.setFont(f);g.drawChars(str,0,6,100,270);g.setColor(Color.GREEN);g.drawRect(400,230,40,40);g.fillRect(401,231,39,39);char str1 = m,o,t,h,e,r;g.drawChars(str1,0,6,450,270);g.setColor(Color.BLUE);g.drawRect(50,30,40,40);g.fillRect(51,31,39,39);char str2 = s,o,n;g.drawChars(str2,0,3,100,70);g.setColor(Color.YELLOW);g.drawRect(400,30,40,40);g.fillRect(401,31,39,39);char str3 = d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论