import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//import javax.print.attribute.AttributeSet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
//import javax.swing.text.BadLocationException;
//import javax.swing.text.PlainDocument;
public class MainWindow
{
/**
* 生成一个缓冲池类对应的对象叫myStorage,以后所有的生产者线程 和消费者线程都对这个myStorage对象进行操作!
*/
MyStorage myStorage = new MyStorage();
// 该数组用来存取生产者线程,最多20个
static Thread[] increaseThread = new IncreaseThread[20];
// 该数组用来存放消费者线程,最多20个
static Thread[] decreaseThread = new DecreaseThread[20];
// 代表生产者对应线程的数目
static int i = 0;
// 代表消费者对应线程的数目
static int d = 0;
/**
* 定义一个显示缓冲区状态的文本框,因为需要在MyStorage类 中用到,因此定义为静态成员变量,便于类外调用。
*/
static TextArea textArea1;
/**
* 定义一个显示当前线程状态的文本框,需要在IncreaseThread和DecreaseThr
* ead这两个线程类中用到,因此定义成静态成员变量,便于类外调用。
*/
static TextArea textArea2;
/**
* 构造了一个最顶层容器JFrame用来作为我们这个程序的主界 面,所有的组件都将包含在上面。这个窗口的布局类型是缺省
* 的,重写了关闭按钮的功能,以便在点击的时候能够结束程序 的运行,最后禁用了最大化按钮来固定大小。
* JFrame中包含了一系列的组件,这些组件有对应的监听器,从 而实现了设计要求中的功能要求。
*/
public void createMainWindow()
{
JFrame jFrame = new JFrame("多进程同步方法演示“生产者-消费者”问题");
jFrame.setVisible(true);
jFrame.setSize(375, 675);
jFrame.setLayout(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//取消最大化
jFrame.setResizable(false);
/**
* 这里的代码是实现设计要求中的第一,二条:生产者数目的调节,范围0~20。
*/
JLabel jLabel3 = new JLabel("生产者数:");
jLabel3.setBounds(25, 105, 120, 20);
jFrame.getContentPane().add(jLabel3);
final JTextField jTextField3 = new JTextField();
jTextField3.setBounds(100, 105, 60, 20);
jTextField3.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent event)
{
char ch = event.getKeyChar();
if (ch < '0' || ch > '9')
{
event.consume();
}
}
});
jFrame.getContentPane().add(jTextField3);
JButton jButton1 = new JButton("增加");
jButton1.setBounds(180, 105, 60, 20);
jFrame.getContentPane().add(jButton1);
// 增加生产者
jButton1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (i < 20)
{
increaseProducer();
jTextField3.setText(String.valueOf(i));
}
}
});
JButton jButton2 = new JButton("减少");
jButton2.setBounds(260, 105, 60, 20);
jFrame.getContentPane().add(jButton2);
// 减少生产者
jButton2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (i > 0)
{
decreaseProducer();
jTextField3.setText(String.valueOf(i));
}
}
});
/**
* 这里的代码是实现设计要求中的第一,二条:消费者数目可调节,范围0~20。
*/
JLabel jLabel4 = new JLabel("消费者数:");
jLabel4.setBounds(25, 135, 120, 20);
jFrame.getContentPane().add(jLabel4);
final JTextField jTextField4 = new JTextField();
jTextField4.setBounds(100, 135, 60, 20);
jFrame.getContentPane().add(jTextField4);
JButton jButton3 = new JButton("增加");
jButton3.setBounds(180, 135, 60, 20);
jFrame.getContentPane().add(jButton3);
// 增加消费者
jButton3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (d < 20)
{
increaseConsumer();
jTextField4.setText(String.valueOf(d));
}
}
});
JButton jButton4 = new JButton("减少");
jButton4.setBounds(260, 135, 60, 20);
jFrame.getContentPane().add(jButton4);
// 减少消费者
jButton4.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (d > 0)
{
decreaseConsumer();
jTextField4.setText(String.valueOf(d));
}
}
});
/**
* 这里的代码是实现了设计要求中的第三条:生产者速度可调。
*/
JLabel jLabel1 = new JLabel("生产速度(毫秒):");
jLabel1.setBounds(25, 25, 120, 20);
jFrame.getContentPane().add(jLabel1);
final JTextField jTextField1 = new JTextField();
jTextField1.setBounds(160, 25, 90, 20);
jTextField1.setText(String.valueOf(IncreaseThread.speed));
jTextField1.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent event)
{
char ch = event.getKeyChar();
if (ch < '0' || ch > '9')
{
event.consume();
}
}
});
jFrame.getContentPane().add(jTextField1);
JButton jButton9 = new JButton("修改");
jButton9.setBounds(270, 25, 60, 20);
jFrame.getContentPane().add(jButton9);
// 在这里实现了控制生产速度的功能
jButton9.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String str1 = jTextField1.getText();
long i = Long.parseLong(str1);
if (i <= 10000 && i >= 0)
{
IncreaseThread.speed = i;
}
else if (i < 0)
{
IncreaseThread.speed = 0;
jTextField1.setText(String.valueOf(IncreaseThread.speed));
}
else
{
IncreaseThread.speed = 10000;
jTextField1.setText(String.valueOf(IncreaseThread.speed));
}
}
});
/**
* 这里的代码是实现了设计要求中的第三条:消费者速度可调。
*/
JLabel jLabel2 = new JLabel("消费速度(毫秒):");
jLabel2.setBounds(25, 55, 120, 20);
jFrame.getContentPane().add(jLabel2);
final JTextField jTextField2 = new JTextField();
jTextField2.setBounds(160, 55, 90, 20);
jTextField2.setText(String.valueOf(DecreaseThread.speed));
jTextField2.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent event)
{
char ch = event.getKeyChar();
if (ch < '0' || ch > '9')
{
event.consume();
}
}
});
jFrame.getContentPane().add(jTextField2);
JButton jButton8 = new JButton("修改");
jButton8.setBounds(270, 55, 60, 20);
jFrame.getContentPane().add(jButton8);
// 这里实现了控制消费速度的功能
jButton8.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
String str2 = jTextField2.getText();
long i = Long.parseLong(str2);
if (i <= 10000 && i >= 0)
{
DecreaseThread.speed = i;
}
else if (i < 0)
{
DecreaseThread.speed = 0;
jTextField2.setText(String.valueOf(DecreaseThread.speed));
}
else
{
DecreaseThread.speed = 10000;
jTextField2.setText(String.valueOf(DecreaseThread.speed));
}
}
});
/**
* 这里构造了能够实现第五条要求的组件,可以显示当前线程的状态,实现了设计要求中的第五条。
*/
JLabel jLabel5 = new JLabel("线程状态:");
jLabel5.setBounds(25, 185, 90, 20);
jFrame.getContentPane().add(jLabel5);
textArea2 = new TextArea();
textArea2.setBounds(115, 185, 225, 100);
jFrame.getContentPane().add(textArea2);
/**
* 这里构造了能够实现第五条要求的组件,可以显示有界缓冲区状态,实现了设计要求中的第五条。
*/
JLabel jLabel7 = new JLabel("有界缓冲区状态:");
jLabel7.setBounds(25, 305, 120, 20);
jFrame.getContentPane().add(jLabel7);
textArea1 = new TextArea();
textArea1.setBounds(145, 305, 190, 320);
jFrame.getContentPane().add(textArea1);
/**
* 这里的代码实现了设计要求第六条,定义了开始,暂停,停止三个按钮,按开始按钮线程将开始执行 生产和消费。
* 可以在运行时按暂停按钮来暂停线程的生产和消费,以便查看當前線程的狀態。按停止,则所�
没有合适的资源?快使用搜索试试~ 我知道了~
操作系统课设用多进程同步方法演示“生产者-消费者”问题
共24个文件
class:16个
java:4个
classpath:1个
5星 · 超过95%的资源 需积分: 50 73 下载量 98 浏览量
2013-07-15
19:43:31
上传
评论 6
收藏 31KB RAR 举报
温馨提示
1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均有二个以上 2) 生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者 3) 生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效 4) 生产者生产的产品由随机函数决定 5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 7) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态
资源推荐
资源详情
资源评论
收起资源包目录
p_c.rar (24个子文件)
p_c
.project 379B
src
DecreaseThread.java 712B
IncreaseThread.java 711B
MyStorage.java 2KB
MainWindow.java 10KB
生产者与消费者.jar 14KB
.settings
org.eclipse.jdt.core.prefs 629B
.classpath 301B
bin
MainWindow$10.class 1KB
MyStorage.class 2KB
IncreaseThread.class 823B
MainWindow$6.class 740B
MainWindow$4.class 967B
DecreaseThread.class 823B
MainWindow$3.class 965B
MainWindow$12.class 1KB
MainWindow$7.class 1KB
MainWindow.class 5KB
MainWindow$1.class 740B
MainWindow$2.class 967B
MainWindow$5.class 965B
MainWindow$11.class 866B
MainWindow$9.class 1KB
MainWindow$8.class 740B
共 24 条
- 1
资源评论
- gaomingwenbusi2013-10-20很好,很有价值的东西。
- FFFYYYYY12342022-11-1466666666
jiangyuw
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功