showPush2(c,index2); showPop1(c,index1);//调用界面显示出栈程序
Main_win.full1.setText(String.valueOf(fullFirst));//int 转String Main_win.empty1.setText(String.valueOf(EmptyFirst));
Main_win.full2.setText(String.valueOf(fullSecond));//int 转String Main_win.empty2.setText(String.valueOf(EmptySecond));
history.his.append(\字符:\ index2++; getnum1++; putnum2++; } }
public synchronized void get2() {
boolean suspended=Main_win.s; if (suspended == true){ try {this.wait();}
catch (InterruptedException e) {} }
if(index2 == 0)//堆栈无数据,不能出栈 {
try{this.wait();}//等待其他线程把数据入栈 catch(InterruptedException e){} }
if(index2>0&&index2<=buffer2.length){ this.notify();//通知其他线程入栈 index2--;
char c = buffer2[index2]; y[index2]=String.valueOf(c); fullSecond=index2;
EmptySecond=buffer2.length-fullSecond; showPop2(c,index2);//调用界面显示出栈程序
Main_win.full2.setText(String.valueOf(fullSecond));//int 转String Main_win.empty2.setText(String.valueOf(EmptySecond)); history.his.append(\中字符\被get\\n\ getnum2++; } }
public static void showPush1(char c,int index){ //字符显示在主界面 String s=String.valueOf(c);
Main_win.see1.append(s+\ }
public static void showPop1(char c,int index){ int i;
x[index]=\
Main_win.see1.setText(\ for(i=0;i<=index;i++){ if(x[i]!=\
Main_win.see1.append(x[i]+\ //see1置空后重新添加原来除move掉的字符
} }
public static void resulewin(){ //最后运行时间,放入取出数目等显示在Result_win Result_win.resultarea.setText(\
Result_win.resultarea.append(\运行总时间:\
Result_win.resultarea.append(\放入总数:\ Result_win.resultarea.append(\取出总数:\ Result_win.resultarea.append(\目前数目:\ Result_win.resultarea.append(\放入总数:\ Result_win.resultarea.append(\取出总数:\ Result_win.resultarea.append(\目前数目:\ Result_win.resultarea.append(\放入总数:\ Result_win.resultarea.append(\取出总数:\ Result_win.resultarea.append(\目前数目:\ }
public static void datasave(){//保存数据 try{
File f=new File(\ data=new FileWriter(f);
datawriter = new BufferedWriter(data); String str=history.his.getText(); datawriter.append(str); datawriter.flush(); datawriter.close(); data.close(); }
catch (IOException e) {} } }
5.2 Runnable接口类
Runnable接口类有五个,分别为:BUFFER_PUT、BUFFERT_MOVE、BUFFERTH_MOVE、BUFFERT_GET和BUFFERTH_GET类。各个类类似,因此此处只给出BUFFER_PUT类的代码。
class BUFFER_PUT implements Runnable// BUFFER线程 {
private BUFFER buff;//生成的字母都保存到同步堆栈中 int i;
public BUFFER_PUT(BUFFER a){ buff = a; }
public void run() {
for(i=0;i<200;i++){
buff.put();//把字母入栈 try{
Thread.sleep((int)(Main_win.p1));
}//每产生一个字母后线程就随即睡眠一段时间
catch(InterruptedException e){} //suspended为TRUE等待,即暂停 } } }
5.3Main_win类
package javaapplication7; import java.awt.*;
import java.awt.event.*; import javax.swing.*; /** *
* @author a101269 */
public class Main_win extends javax.swing.JFrame { /**
* Creates new form Buffer_win */
static int p1,m2,m3,g2,g3,r1,r2,r3; static boolean s = false; static long starttime; static long endtime; static long gotime;
public Main_win() {
setTitle(\生产者消费者问题\ initComponents();
}
private void beginActionPerformed(java.awt.event.ActionEvent evt) { new history().setVisible(true); starttime=System.currentTimeMillis(); see1.setText(\ see2.setText(\ see3.setText(\ full1.setText(\ full2.setText(\ full3.setText(\ empty1.setText(\ empty2.setText(\ empty3.setText(\ waitnum.setText(\
BUFFER buff = new BUFFER();
Runnable buffer1 = new BUFFER_PUT(buff); Runnable buffer2 = new BUFFERT_MOVE(buff);
Runnable buffer3 = new BUFFERTH_MOVE(buff); Runnable buffer4 = new BUFFERT_GET(buff);
Runnable buffer5 = new BUFFERTH_GET(buff); Thread t11 = new Thread(buffer1);
Thread t12 = new Thread(buffer1); Thread t2 = new Thread(buffer2); Thread t3 = new Thread(buffer3); Thread t41 = new Thread(buffer4); Thread t42 = new Thread(buffer4); Thread t51 = new Thread(buffer5); Thread t52 = new Thread(buffer5);
t11.start(); t12.start(); t2.start(); t3.start(); t41.start(); t51.start();
t42.start();
t52.start();
// TODO add your handling code here:
}
private void endActionPerformed(java.awt.event.ActionEvent evt) { s = true;
endtime=System.currentTimeMillis(); gotime=endtime-starttime;
BUFFER buff = new BUFFER();
new Result_win().setVisible(true);// TODO add your handling code here: buff.resulewin();//结束,显示运行结果 }
private void datasaveActionPerformed(java.awt.event.ActionEvent evt) { BUFFER buff = new BUFFER(); buff.datasave(); {
JOptionPane.showMessageDialog(this,\保存成\ARNING_MESSAGE);
}// TODO add your handling code here: }
private void setokActionPerformed(java.awt.event.ActionEvent evt) { if(ps1.getText().equals(\
ms3.getText().equals(\ gs3.getText().equals(\ room2.getText().equals(\ {
JOptionPane.showMessageDialog(this,\有未填项\提\ARNING_MESSAGE);
} else{
r1 = Integer.parseInt(room1.getText()); r2 = Integer.parseInt(room2.getText()); r3 = Integer.parseInt(room3.getText()); p1 = Integer.parseInt(ps1.getText()); m2 = Integer.parseInt(ms2.getText()); m3 = Integer.parseInt(ms3.getText()); g2 = Integer.parseInt(gs2.getText()); g3 = Integer.parseInt(gs3.getText()); JOptionPane.showMessageDialog(this,\设置成\ARNING_MESSAGE);
功 醒功