求教,程序有点错误

青竹剑侠 2012-11-24 01:31:22
做了个生产者消费者,生产的时候缓冲池中的商品数就逐个增加的,可是消费的时候缓冲池中的商品不变,可是我的商品数是减少了,就是画不出来,我感觉就是这里有问题

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);
}
}



...全文
197 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
青竹剑侠 2012-11-25
  • 打赏
  • 举报
回复
引用 6 楼 nmyangym 的回复:
不要新加的线程,在run()里控制一下,楼主试试: Java code?1234567891011121314151617181920212223242526272829303132333435363738 public void run() { while(true) { ……
问题解决,谢谢,给分。
nmyangym 2012-11-25
  • 打赏
  • 举报
回复
不要新加的线程,在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
         }
青竹剑侠 2012-11-24
  • 打赏
  • 举报
回复
人呢,难道还要我加分????
青竹剑侠 2012-11-24
  • 打赏
  • 举报
回复
怎么没人啊。。。。。。。
青竹剑侠 2012-11-24
  • 打赏
  • 举报
回复
我改了一下,但是还是不能控制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);
	}
}



nmyangym 2012-11-24
  • 打赏
  • 举报
回复
另外楼主的代码最好把flag值控制一下,不要出现负值。 还有最好不要用过时(deprecated)的方法。
nmyangym 2012-11-24
  • 打赏
  • 举报
回复
是那段代码有问题。 原因是在消费以后,绘制的方块减少了。但最外边的方块没有清除。我这办法未必好,楼主参考一下:

        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);
            }
        }
代码下载链接: https://pan.quark.cn/s/a8fbca3925b4 《鸿蒙OS开发环境构建》指南系统性地阐述了配置和筹备鸿蒙OS开发所需的各种工具和条件的具体方法。鸿蒙OS,亦称HarmonyOS,是由华为研发的一款面向全场景的分布式操作系统,其目标是提供跨平台、多设备间无缝协作的使用体验。本指南涉及了从Linux服务器到Windows工作站的完整开发流程。指南中提及了MobaXterm,这是一款用于连接Linux源码服务器的软件,使得开发人员能够在Windows环境中远程访问Linux服务器。同时,HiTool作为烧录工具,用于将编译后的系统镜像写入开发板。IPOP.EXE则是一款串口终端软件,用于执行串行通信和调试任务。Embedded Studio用于开发设备驱动程序,而DevEco Studio是华为提供的图形化应用程序开发平台,支持C/C++语言,拥有代码编辑、编译、烧录和调试功能,被视为OpenHarmony智能设备开发者的首选集成开发环境。在硬件配置方面,指南列出了必需的设备,包括Linux服务器(推荐Ubuntu 16.04及以上版本),Windows工作台(兼容XP/7/10),以及Hi3518EV300 IoT Camera单板。开发期间,Windows工作台通过USB线与单板相连接,以实现数据传输。此外,为了开展开发工作,还需要安装putty、IPOP、tftp服务器等辅助软件,以及HiTool用于烧录操作。在软件系统要求方面,Linux服务器需要安装bash、Python3.7+、gn、ninja、LLVM等构建工具,这些工具对于生成和执行编译脚本具有关键作用。在Windows工作台上,建议采用Visual Studi...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧