关于生产者和消费者一个简单的问题求助!
我写的程序编译和运行都没有报错,但是不知道为什么界面上没有显示预期结果,代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainFrame extends JFrame implements Runnable {
JPanel panel = new JPanel(new BorderLayout());
JPanel panel1 = new JPanel(new BorderLayout());
JPanel panel11 = new JPanel();
JPanel panel12 = new JPanel();
JPanel panel13 = new JPanel();
JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel panel3 = new JPanel(new BorderLayout());
JPanel panel31 = new JPanel();
JPanel panel32 = new JPanel();
JPanel panel33 = new JPanel();
JLabel label1 = new JLabel( "生产时间间隔: ");
JLabel label2 = new JLabel( "容器大小: ");
JLabel label3 = new JLabel( "消费时间间隔: ");
JTextField textField1 = new JTextField(10);
JTextField textField2 = new JTextField(10);
JTextField textField3 = new JTextField(10);
JLabel[] label;
JLabel label11;
JButton ProducerButton_start = new JButton( "启动生产 ");
JButton ProducerButton_suspend = new JButton( "暂停生产 ");
JButton ConsumerButton_start = new JButton( "启动消费 ");
JButton ConsumerButton_suspend = new JButton( "暂停消费 ");
JLabel label4 = new JLabel( "产品数量: ");
JLabel label5 = new JLabel( "0 ");
Thread producer_thread_start = new Thread(this);
Thread producer_thread_stop = new Thread(this);
Thread producer_thread_suspend = new Thread(this);
Thread producer_thread_resume = new Thread(this);
Thread consumer_thread_start = new Thread(this);
Thread consumer_thread_stop = new Thread(this);
Thread consumer_thread_suspend = new Thread(this);
Thread consumer_thread_resume = new Thread(this);
int s = 0;
suspend_and_resume sr1 = new suspend_and_resume();
suspend_and_resume sr2 = new suspend_and_resume();
int x_size, y_size;
int flag = 0;
int sum = 0;
volatile boolean istrue1;
volatile boolean istrue2;
volatile boolean suspend_flag1 = false;
volatile boolean suspend_flag2 = false;
Object obj1 = new Object();
Object obj2 = new Object();
volatile boolean available1 = false;
volatile boolean available2 = false;
public MainFrame() {
super( "生产者与消费者 ");
setSize(300, 500);
x_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
y_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
setLocation((x_size - 300) / 2, (y_size - 500) / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ProducerButton_start.addActionListener(new ProducerStartAction());
ProducerButton_suspend.addActionListener(new ProducerSuspendAction());
ConsumerButton_start.addActionListener(new ConsumerStartAction());
ConsumerButton_suspend.addActionListener(new ConsumerSuspendAction());
panel11.add(label1);
panel11.add(textField1);
panel12.add(label2);
panel12.add(textField2);
panel13.add(label3);
panel13.add(textField3);
panel1.add(panel11,BorderLayout.NORTH);
panel1.add(panel13,BorderLayout.CENTER);
panel1.add(panel12,BorderLayout.SOUTH);
panel31.add(ProducerButton_start);
panel31.add(ConsumerButton_start);
panel32.add(ProducerButton_suspend);
panel32.add(ConsumerButton_suspend);
panel33.add(label4);
panel33.add(label5);
panel3.add(panel33,BorderLayout.NORTH);
panel3.add(panel31,BorderLayout.CENTER);
panel3.add(panel32,BorderLayout.SOUTH);
panel.add(panel1,BorderLayout.NORTH);
panel.add(panel2,BorderLayout.CENTER);
panel.add(panel3,BorderLayout.SOUTH);
setContentPane(panel);
setVisible(true);
setResizable(true);
}
class ProducerStartAction extends Thread implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(!(producer_thread_start.isAlive()))
{
producer_thread_start = new Thread(this);
}
if (ProducerButton_start.getText().equals( "启动生产 ")) {
ProducerButton_start.setText( "停止生产 ");
producer_thread_start.start();
} else {
ProducerButton_start.setText( "启动生产 ");
producer_thread_stop.start();
}
}
}
class ProducerSuspendAction extends Thread implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(!(producer_thread_suspend.isAlive()))
{
producer_thread_suspend = new Thread(this);
}
if (ProducerButton_suspend.getText().equals( "暂停生产 ")) {
ProducerButton_suspend.setText( "恢复生产 ");
producer_thread_suspend.start();
} else {
ProducerButton_suspend.setText( "暂停生产 ");
producer_thread_resume.start();
}
}
}
class ConsumerStartAction extends Thread implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(!(consumer_thread_start.isAlive()))
{
consumer_thread_start = new Thread(this);
}
if (ConsumerButton_start.getText().equals( "启动消费 ")) {
ConsumerButton_start.setText( "停止消费 ");
consumer_thread_start.start();
} else {
ConsumerButton_start.setText( "启动消费 ");
consumer_thread_stop.start();
}
}
}
class ConsumerSuspendAction extends Thread implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(!(consumer_thread_suspend.isAlive()))
{
consumer_thread_suspend = new Thread(this);
}
if (ConsumerButton_suspend.getText().equals( "暂停消费 ")) {
ConsumerButton_suspend.setText( "恢复消费 ");
consumer_thread_suspend.start();
} else {
ConsumerButton_suspend.setText( "暂停消费 ");
consumer_thread_resume.start();
}
}
}
public void run() {
if (flag == 0) {
label = new JLabel[Integer.parseInt(textField2.getText())];
for (int i = 0; i < Integer.parseInt(textField2.getText()); i++) {
label[i] = new JLabel( " ");
panel2.add(label[i]);
}
flag = 1;
}
if (Thread.currentThread() == producer_thread_start) {
istrue1 = true;
while (s < Integer.parseInt(textField2.getText())) {
if (istrue1 == true) {
label[s].setText( "0 ");
s ++;
sum ++;
label5.setText( " " + sum);
try {
producer_thread_start.sleep(Integer.parseInt(textField1.getText()));
} catch (InterruptedException e) {
}
if (suspend_flag1) {
sr1.suspend1();
}
}
}
} else if (Thread.currentThread() == producer_thread_stop)
istrue1 = false;
else if (Thread.currentThread() == producer_thread_suspend)
suspend_flag1 = true;
else if (Thread.currentThread() == producer_thread_resume) {
suspend_flag1 = false;
sr1.resume1();
} else if (Thread.currentThread() == consumer_thread_start) {
istrue2 = true;
while ((s - 1) > = 0 && (s - 1) < Integer.parseInt(textField2.getText())) {
if (istrue2 == true) {
label[s - 1].setText( " ");
s--;
sum --;
label5.setText( " " + sum);
try {
consumer_thread_start.sleep(Integer.parseInt(textField3
.getText()));
} catch (InterruptedException e) {
}
if (suspend_flag2) {
sr2.suspend1();
}
}
}
} else if (Thread.currentThread() == consumer_thread_stop)
istrue2 = false;
else if (Thread.currentThread() == consumer_thread_suspend)
suspend_flag2 = true;
else if (Thread.currentThread() == consumer_thread_resume) {
suspend_flag2 = false;
sr2.resume1();
}
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame();
}
}
class suspend_and_resume {
private boolean available;
public synchronized void suspend1() {
available = false;
while (available == false) {
try {
wait();
} catch (InterruptedException e) {}
}
}
public synchronized void resume1() {
available = true;
notify();
}
}
[解决办法]
太长了,懒得看。。你具体遇到的问题给大家说说,一片代码没几个人会有时间看的。
[解决办法]
恩,感觉是有点....长了.既然你只是研究生产者/消费者,何不就写一段控制台程序,那样或许还有人能帮你看看(我不懂awt).
还有,兄台可以把问题描述更详细一点,例如 "你预期的结果是怎样,而出来的结果是怎样,估计问题出在哪里 ".除非自己很了解自己到底想做什么.
而且,可以自己debug一下,可以发现一些问题.
对不起,小弟实在无能为力.帮你顶一下吧.
