importjava.util.ArrayList;importjava.util.List;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestextendsJFrame{//主类,继承窗体privateJPanelpanel1=newJPanel();privateJPanelpanel2=newJPanel();privateThreadthreadWQ1;privateThreadthreadRQ1;publicstaticJTextAreatextarea;publicstaticJTextFieldtextbox;publicstaticJScrollPanescrollpane;publicJProgressBarprogressbar=newJProgressBar();QueueQ=newQueue();ProducerwQ1=newProducer(Q);ConsumerrQ1=newConsumer(Q);publicinterfaceputmsg{publicvoidoutput(Stringmsg,JTextAreatextaera,JProgressBarjbr);publicvoidbuffer(JTextFieldnumber);}publicTest(){setSize(600,600);setLocation(100,100);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);layoutPanel1();layoutPanel2();setLayout(newBorderLayout());add(panel1,BorderLayout.SOUTH);add(panel2,BorderLayout.NORTH);}publicvoidlayoutPanel1(){//可视化代码JButtonbutton1=newJButton(开始模拟);JButtonbutton2=newJButton(暂停模拟);JButtonbutton3=newJButton(恢复运行);JButtonbutton4=newJButton(停止模拟);JButtonbutton5=newJButton(暂停生产);JButtonbutton6=newJButton(暂停消费);JButtonbutton7=newJButton(恢复消费);JButtonbutton8=newJButton(恢复生产);JButtonbutton9=newJButton(关闭);textbox=newJTextField(9,2);button1.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadWQ1=newThread(wQ1,thread-wQ1);threadRQ1=newThread(rQ1,thread-rQ1);Q.maxMessageNum=Integer.parseInt(textbox.getText());progressbar.setMaximum(Q.maxMessageNum);threadWQ1.start();//开始模拟threadRQ1.start();textarea.append(所有线程已开始运行+\n);}});button2.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadWQ1.suspend();//暂停模拟threadRQ1.suspend();textarea.append(所有线程已暂停+\n);}});button3.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){textarea.append(正在恢复生产和消费+\n);threadWQ1.resume();//恢复运行threadRQ1.resume();}});button4.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadWQ1.stop();//停止模拟threadRQ1.stop();textarea.append(所有线程已停止+\n);}});button5.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadWQ1.suspend();textarea.append(已暂停生产+\n);}});button6.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadRQ1.suspend();textarea.append(已暂停消费+\n);}});button7.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadRQ1.resume();textarea.append(已恢复消费+\n);}});button8.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){threadWQ1.resume();textarea.append(已恢复生产+\n);}});button9.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){System.exit(0);}});panel1.setLayout(newGridLayout());panel1.add(textbox);panel1.add(button1);panel1.add(button4);panel1.add(button5);panel1.add(button8);panel1.add(button6);panel1.add(button7);panel1.add(button2);panel1.add(button3);}publicvoidlayoutPanel2(){//可视化代码textarea=newJTextArea(25,52);progressbar.setEnabled(true);textarea.append(\n请按开始按钮\n);textarea.setEditable(false);textarea.setBackground(Color.pink);scrollpane=newJScrollPane(textarea);scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);panel2.setLayout(newBorderLayout());panel2.add(scrollpane,BorderLayout.NORTH);panel2.add(progressbar,BorderLayout.SOUTH);}staticclassMessage{publicstaticintid;//序列号publicStringcontent;//消息内容publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this.content=content;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}}publicclassQueueimplementsputmsg{//消息队列类ListMessagequeue=newArrayListMessage();intmaxMessageNum;publicsynchronizedvoidproduce(Messagemessage){//实现生产的函数this.notifyAll();while(queue.size()==maxMessageNum){output(Thread.currentThread().getName()+队列满!等待中。。。,textarea,progressbar);try{this.wait();}catch(InterruptedExceptione){e.printStackTrace();}}queue.add(message);output(Thread.currentThread().getName()+正在生产+message.getContent()+。。。,当前个数:+getCount(),textarea,progressbar);}publicsynchronizedvoidconsume(){//实现消费的函数this.notifyAll();while(queue.size()==0){output(Thread.currentThread().getName()+队列空!等待中。。。,textarea,progressbar);try{output(等待生产......,textarea,progressbar);wait();output(结束等待!,textarea,progressbar);}catch(InterruptedExceptione){e.printStackTrace();}}Messagemessage=queue.get(0);queue.remove(0);output(Thread.currentThread().getName()+正在消费+message.getContent()+。。。,当前个数:+getCount(),textarea,progressbar);}publicsynchronizedintgetCount(){returnqueue.size();}publicvoidoutput(Stringmsg,JTextAreatextarea,JProgressBarprogressbar){//输出函数textarea.append(msg+\n);textarea.append(\n当前容量:+this.getCount());progressbar.setValue(this.getCount());}publicvoidbuffer(JTextFieldnumber){this.maxMessageNum=Integer.parseInt(number.getText());}}publicstaticvoidmain(String[]args){Testdemo=newTest();demo.setVisible(true);}classProducerextendsThread{//生产者类privateQueuequeue;Producer(Queuequeue){this.queue=queue;}publicvoidrun(){for(inti=0;i100;i++){//生产者总共生产100个食物Messagemessage=newMessage();message.setId(++Messag