首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

求教,程序有点异常

2012-12-14 
求教,程序有点错误做了个生产者消费者,生产的时候缓冲池中的商品数就逐个增加的,可是消费的时候缓冲池中的

求教,程序有点错误
做了个生产者消费者,生产的时候缓冲池中的商品数就逐个增加的,可是消费的时候缓冲池中的商品不变,可是我的商品数是减少了,就是画不出来,我感觉就是这里有问题


public void goodsShow()
{
Graphics g1=panel[1].getGraphics();
panel[1].setBackground(Color.white);
g1.setColor(Color.red);
System.out.println("商品数为:"+flag);
for(int i=0;i<flag;i++)
{
g1.fillRect(40*i, 0, 35, 40);
}
}



全部代码如下


import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainFrame extends JFrame implements ActionListener{
private JPanel[] panel=new JPanel[3];
private DrawThread[] draw;
private JButton button1,button2,button3;
private JLabel label6;
static int flag=0;

public MainFrame()
{
setTitle("欢迎来到java世界");
setSize(1300,600);
draw=new DrawThread[3];
draw[0]=new DrawThread(100,80,0);
draw[1]=new DrawThread(400,280,1);
draw[2]=new DrawThread(700,480,2);
Font f1=new Font("宋体",Font.BOLD+Font.ITALIC,25);
Font f2=new Font("宋体",Font.BOLD+Font.HANGING_BASELINE,20);

button1=new JButton("开始生产");
button2=new JButton("开始消费");
button3=new JButton("退出");
JLabel label1=new JLabel("生产者-消费者 演示实验");
JLabel label2=new JLabel("生产者");
JLabel label3=new JLabel("缓冲池");
JLabel label4=new JLabel("消费者");
JLabel label5=new JLabel("制作人          韩旭辉");
JLabel label6=new JLabel("");
for(int i=0;i<panel.length;i++)
panel[i]=new JPanel();
label1.setFont(f1);
label5.setFont(f1);
label2.setFont(f2);
label3.setFont(f2);
label4.setFont(f2);
label6.setFont(f2);

label1.setBounds(900, 40, 400, 30);
label2.setBounds(20, 90, 80, 20);
label3.setBounds(320, 290, 80, 20);
label4.setBounds(620, 490, 80, 20);
label5.setBounds(100, 520, 400, 30);
label6.setBounds(420, 240, 400, 30);

panel[0].setBounds(100, 80, 300, 40);
panel[0].setBackground(Color.white);
panel[1].setBounds(400, 280, 320, 40);
panel[1].setBackground(Color.white);
panel[2].setBounds(700, 480, 300, 40);
panel[2].setBackground(Color.white);

button1.setBounds(520, 85, 100, 30);
button2.setBounds(1120, 485, 100, 30);
button3.setBounds(1160, 120, 100, 30);
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);

Container contentPane = getContentPane();
contentPane.setLayout(null);

contentPane.add(label1);
contentPane.add(label2);
contentPane.add(label3);
contentPane.add(label4);
contentPane.add(label5);
contentPane.add(label6);
contentPane.add(panel[0]);
contentPane.add(panel[1]);
contentPane.add(panel[2]);
contentPane.add(button1);
contentPane.add(button2);
contentPane.add(button3);


}

public void actionPerformed(ActionEvent e)
{
Object s=e.getSource();
if(s==button1)
{
if(button1.getText().equals("开始生产"))
{
draw[0].start();
button1.setText("暂停生产");

else if(button1.getText().equals("暂停生产"))
{
draw[0].suspend();
button1.setText("继续生产");
}
else if(button1.getText().equals("继续生产"))
{
draw[0].resume();
button1.setText("暂停生产");
}

}
else if(s==button2)
{
if(button2.getText().equals("开始消费"))
{
draw[2].start();
    button2.setText("暂停消费");
}
else if(button2.getText().equals("暂停消费"))
{
draw[2].suspend();
button2.setText("继续消费");
}
else if(button2.getText().equals("继续消费"))
{
draw[2].resume();
button2.setText("暂停消费");
}
}
else if(s==button3)
System.exit(0);
}

class DrawThread extends Thread
{
int x,y,id;
int temp=0;

public DrawThread(int x,int y,int id)
{
this.x=x;
this.y=y;
this.id=id;
}

public void drawMe()
{
Graphics g=panel[id].getGraphics();
panel[id].setBackground(Color.white);
g.setColor(Color.red);
g.fillRect(0, 0, temp, 40);
}

public void goodsShow()
{
Graphics g1=panel[1].getGraphics();
panel[1].setBackground(Color.white);
g1.setColor(Color.red);
System.out.println("商品数为:"+flag);
for(int i=0;i<flag;i++)
{
g1.fillRect(40*i, 0, 35, 40);
}
}

 public void run()
 { 
 while(true)
 {
 try{
 drawMe();
 temp+=3;
 sleep(10); 
 if(temp>=300)
 {
 Graphics g=panel[id].getGraphics();
 g.setColor(Color.white);
 g.fillRect(0, 0, 300, 40);
 temp=0;
 if(id==0)
 flag++;
 else if(id==2)
 flag--;
 goodsShow();
 }  
 }catch(Exception e){}
 }
 }
}

public static void main(String[] args)
{
MainFrame mainFrame=new MainFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int WIDTH=screenSize.width;
int HEIGHT=screenSize.height;
mainFrame.setLocation(WIDTH/36,HEIGHT/10);
mainFrame.setVisible(true);
}
}




[最优解释]
不要新加的线程,在run()里控制一下,楼主试试:
          public void run()
         { 
             while(true)
             { 
                 try{
                        if(id==0&&flag<8)
                        {


                           drawMe();
                           temp+=3;
                           sleep(10); 
                           if(temp>=300)
                           { 
                              Graphics g=panel[id].getGraphics();
                              g.setColor(Color.white);
                              g.fillRect(0, 0, 300, 40);
                              temp=0;
                              changeCondition();
                              goodsShow();
                           }
                        }
                        else if(id==2&&flag>0)
                        {
                           drawMe();
                           temp+=3;
                           sleep(10); 
                           if(temp>=300)
                           { 
                              Graphics g=panel[id].getGraphics();
                              g.setColor(Color.white);


                              g.fillRect(0, 0, 300, 40);
                              temp=0;
                              changeCondition();
                              goodsShow();
                           }
                        }
                    }catch(Exception e){}
             }//end while
         }


[其他解释]
是那段代码有问题。
原因是在消费以后,绘制的方块减少了。但最外边的方块没有清除。我这办法未必好,楼主参考一下:

        public void goodsShow()
        {
            Graphics g1=panel[1].getGraphics();
            panel[1].setBackground(Color.white);
            //---------------------------------加上这段
            if(id==2)
            {
                  g1.setColor(Color.white);
                  for(int i=0;i<flag+1;i++)//注意这是i+1.
                  {
                        g1.fillRect(40*i, 0, 35, 40);
                  }
            }
           //---------------------------------
            g1.setColor(Color.red);
            System.out.println("商品数为:"+flag);
            for(int i=0;i<flag;i++)
            {
                g1.fillRect(40*i, 0, 35, 40);
            }
        }

[其他解释]
怎么没人啊。。。。。。。
------其他解决方案--------------------


另外楼主的代码最好把flag值控制一下,不要出现负值。
还有最好不要用过时(deprecated)的方法。
[其他解释]
我改了一下,但是还是不能控制flag,我想是flag等于8时不能生产,flag等于0的时候不能消费,求高手指点,代码如下,貌似我新增的一个线程drawListener没起作用


import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainFrame extends JFrame implements ActionListener{
private JPanel[] panel=new JPanel[3];
private DrawThread[] draw;
private listenerThread drawListener;
private JButton button1,button2,button3;
private JLabel label6;
static int flag=0;
static int last=0;   //保存上一次的数目

public MainFrame()
{
setTitle("欢迎来到java世界");
setSize(1300,600);
draw=new DrawThread[3];
draw[0]=new DrawThread(100,80,0);//panel[0]控件在画
drawListener=new listenerThread();
draw[2]=new DrawThread(700,480,2);//panel[2]控件在画
Font f1=new Font("宋体",Font.BOLD+Font.ITALIC,25);
Font f2=new Font("宋体",Font.BOLD+Font.HANGING_BASELINE,20);

button1=new JButton("开始生产");
button2=new JButton("开始消费");
button3=new JButton("退出");
JLabel label1=new JLabel("生产者-消费者 演示实验");
JLabel label2=new JLabel("生产者");
JLabel label3=new JLabel("缓冲池");
JLabel label4=new JLabel("消费者");
JLabel label5=new JLabel("制作人          韩旭辉");
JLabel label6=new JLabel("111111111");
for(int i=0;i<panel.length;i++)
panel[i]=new JPanel();
label1.setFont(f1);
label5.setFont(f1);
label2.setFont(f2);
label3.setFont(f2);
label4.setFont(f2);
label6.setFont(f2);

label1.setBounds(900, 40, 400, 30);
label2.setBounds(20, 90, 80, 20);
label3.setBounds(320, 290, 80, 20);
label4.setBounds(620, 490, 80, 20);
label5.setBounds(100, 520, 400, 30);
label6.setBounds(420, 240, 400, 30);

panel[0].setBounds(100, 80, 300, 40);
panel[0].setBackground(Color.white);
panel[1].setBounds(400, 280, 320, 40);
panel[1].setBackground(Color.white);
panel[2].setBounds(700, 480, 300, 40);
panel[2].setBackground(Color.white);

button1.setBounds(520, 85, 100, 30);
button2.setBounds(1120, 485, 100, 30);
button3.setBounds(1160, 120, 100, 30);
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);

Container contentPane = getContentPane();
contentPane.setLayout(null);

contentPane.add(label1);
contentPane.add(label2);
contentPane.add(label3);
contentPane.add(label4);
contentPane.add(label5);
contentPane.add(label6);
contentPane.add(panel[0]);
contentPane.add(panel[1]);
contentPane.add(panel[2]);
contentPane.add(button1);
contentPane.add(button2);
contentPane.add(button3);

drawListener.start();
}

public void actionPerformed(ActionEvent e)


{
Object s=e.getSource();
if(s==button1)
{
if(button1.getText().equals("开始生产"))
{
draw[0].start();
button1.setText("暂停生产");

else if(button1.getText().equals("暂停生产"))
{
draw[0].suspend();
button1.setText("继续生产");
}
else if(button1.getText().equals("继续生产"))
{
draw[0].resume();
button1.setText("暂停生产");
}

}
else if(s==button2)
{
if(button2.getText().equals("开始消费"))
{
draw[2].start();
    button2.setText("暂停消费");
}
else if(button2.getText().equals("暂停消费"))
{
draw[2].suspend();
button2.setText("继续消费");
}
else if(button2.getText().equals("继续消费"))
{
draw[2].resume();
button2.setText("暂停消费");
}
}
else if(s==button3)
System.exit(0);
}

class DrawThread extends Thread
{
int x,y,id;
int temp=0;

public DrawThread(int x,int y,int id)
{
this.x=x;
this.y=y;
this.id=id;
}

public void drawMe()
{
Graphics g=panel[id].getGraphics();
panel[id].setBackground(Color.white);
g.setColor(Color.red);
g.fillRect(0, 0, temp, 40);
}

public void changeCondition()
{
last=flag;
if(id==0)
flag++;
else if(id==2)
flag--;
}

public void goodsShow()

Graphics g1=panel[1].getGraphics();     
panel[1].setBackground(Color.white);
System.out.println(last);   
System.out.println("商品数为:"+flag);      
if(last<=flag)
{        //当上次的数目小于等于这次的数目
g1.setColor(Color.red);       
    for(int i=0;i<flag;i++)       
    {         
    g1.fillRect(40*i, 0, 35, 40);      
    }   
}
else
{             //当上次的数目大于这次的数目   
for(int i=0;i<last;i++)       
{   
if(i<flag)
{                                     
          g1.setColor(Color.red);        //符合这次生产数目的画红色
        }
else
{
g1.setColor(Color.white);    //超过本次生产数目,但上次已经画过的部分重新画成背景色
        } 
g1.fillRect(40*i, 0, 35, 40);      
}   
}
}

 public void run()
 { 
 while(true)
 {
 try{
 drawMe();
 temp+=3;
 sleep(10); 
 if(temp>=300)
 {
 Graphics g=panel[id].getGraphics();
 g.setColor(Color.white);
 g.fillRect(0, 0, 300, 40);


 temp=0;
 changeCondition();
 goodsShow();
 }  
 }catch(Exception e){}
 }
 }
}

class listenerThread extends Thread
{
public void run()
{
try{
label6.setText("缓冲池已满,不能生产!");
System.out.println("我在这");
sleep(50);
if(flag>=8)
{
label6.setText("缓冲池已满,不能生产!");
draw[0].suspend();
button1.setText("继续生产");
}
else if(flag<0)
{
label6.setText("缓冲池已空,不能消费!");
draw[2].suspend();
button2.setText("继续消费");
}
}catch(Exception e){}
}
}

public static void main(String[] args)
{
MainFrame mainFrame=new MainFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int WIDTH=screenSize.width;
int HEIGHT=screenSize.height;
mainFrame.setLocation(WIDTH/36,HEIGHT/10);
mainFrame.setVisible(true);
}
}




[其他解释]
人呢,难道还要我加分????
[其他解释]
引用:
不要新加的线程,在run()里控制一下,楼主试试:
Java code?1234567891011121314151617181920212223242526272829303132333435363738          public void run()         {              while(true)             {       ……

问题解决,谢谢,给分。

热点排行