黑马程序员技术交流社区
标题:
Java 线程同步问题,生产者和消费者的问题
[打印本页]
作者:
wht
时间:
2012-6-30 23:00
标题:
Java 线程同步问题,生产者和消费者的问题
public class Produce {
int num;
public int getNum() {
return num;
}
public void add() {
this.num++;
System.out.println("生产了一个产品");
System.out.println("还有"+this.getNum()+"个产品");
}
public void subtract() {
this.num--;
System.out.println("消耗了一个产品");
System.out.println("还有"+this.getNum()+"个产品");
}
public void setNum(int num) {
this.num = num;
}
public Produce(int num) {
super();
this.num = num;
}
}
产品类, 产品的数量在 0到10之间,但是类里没表现出来。
public class Producer implements Runnable {
Produce Produce;
public Producer(Produce produce) {
Produce = produce;
}
@Override
public void run() {
while(true){
synchronized (Produce) {
if(Produce.getNum()==0){
Produce.add();
notify();
}else if(Produce.getNum()==10){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
Produce.add();
}
}
}
}
}
这个是生产者类,中间有判断产品数量的 ,等于十 等待,等于一,增加一个后,通知消费者,否则正常生产,
public class Consumer implements Runnable{
Produce Produce;
public Consumer(Produce produce) {
Produce = produce;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized (Produce) {
if(Produce.getNum()==10){
Produce.subtract();
notify();
}else if (Produce.getNum()==0) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
Produce.subtract();
}
} } }
}
消费者类,
public static void main(String[] args) {
// TODO Auto-generated method stub
Produce produce=new Produce(8);
Consumer consumer=new Consumer(produce);
Producer Producer=new Producer(produce);
new Thread(Producer).start();
new Thread(consumer).start();
}
测试类
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at 生产者.Producer.run(Producer.java:20)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at 生产者.Consumer.run(Consumer.java:16)
at java.lang.Thread.run(Unknown Source)
最后总是这个错误,包的名字是中文,求高手帮我解答一下,哪错了,而且那
notify(); wait();方法都是在eclipse里直接用的,具体的对象都不用写,总觉得有点错误似的,
作者:
周刚
时间:
2012-7-1 00:51
本帖最后由 周刚 于 2012-7-1 00:53 编辑
报错大致是说Consumer里面的run方法出错,说的是“不合法的监听器状态”。
public Consumer(Produce produce) {
Produce = produce;
}
先不说线程的问题,上面这代码就看着挺别扭:
首先Produce Produce,把变量名首字母大写,搞得和
类名一样的。代码格式不规范,看起来真费劲!线程
本本就挺复杂,会出各种问题,建议最好把代码写得规范
一些,不要给线程的分析添乱。代码规范了,再说分析
线程的问题。
作者:
孙飞
时间:
2012-7-1 10:08
本帖最后由 feigecal 于 2012-7-1 11:36 编辑
你的我看着有点乱,我按你的意思把你的改了一下,
class Produce
{
int num;
public synchronized void add()
{
if(this.getNum()<10)
{
this.num++;
System.out.println("生产了一个产品");
System.out.println("还有"+this.getNum()+"个产品");
}
else
{
try{wait();}catch(Exception e){}
}
notify();
}
public synchronized void subTract()
{
if(this.getNum()>0)
{
this.num--;
System.out.println("消耗了一个产品");
System.out.println("还有"+this.getNum()+"个产品");
}
else
{
try{wait();}catch(Exception e){}
}
notify();
}
public Produce(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
}
class Producer implements Runnable //生产者类
{
Produce produce;
public Producer(Produce produce)
{
this.produce = produce;
}
public void run()
{
while(true)
{
produce.add();
}
}
}
class Consumer implements Runnable//消费者类
{
Produce produce;
public Consumer(Produce produce)
{
this.produce = produce;
}
public void run()
{
while(true)
{
produce.subTract();
}
}
}
class ShengXiao//主函数类
{
public static void main(String[] args)
{
Produce produce=new Produce(8);
Consumer consumer=new Consumer(produce);
Producer Producer=new Producer(produce);
new Thread(consumer).start();
new Thread(Producer).start();
}
}
复制代码
输出结果为先消费,消费到0时通知生产者生产,生产到10是再通知消费者,这样循环
如果想让它在0到10之内 随意的生产和消费,不按必须生产满再消费或消费完再生产的话,就可以用我下面写的代码,因为0 到10 太少了,测试时看不出随意效果,所以我用的是资源最多是100,也就是0到100,为了看效果,让中间有个睡的时间
class Produce
{
int num;
public void add()
{
synchronized (this)
{
if(this.getNum()<100)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
this.num+=1;
System.out.println("生产了一个产品");
System.out.println("还有"+this.getNum()+"个产品");
}
}
}
public void subTract()
{
synchronized(this)
{
if(this.getNum()>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
this.num-=1;
System.out.println("消耗了一个产品");
System.out.println("还有"+this.getNum()+"个产品");
}
}
}
public Produce(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
}
class Producer implements Runnable //生产者类
{
Produce produce;
public Producer(Produce produce)
{
this.produce = produce;
}
public void run()
{
while(true)
{
produce.add();
}
}
}
class Consumer implements Runnable//消费者类
{
Produce produce;
public Consumer(Produce produce)
{
this.produce = produce;
}
public void run()
{
while(true)
{
produce.subTract();
}
}
}
class ShengXiao2//主函数类
{
public static void main(String[] args)
{
Produce produce=new Produce(8);
Consumer consumer=new Consumer(produce);
Producer Producer=new Producer(produce);
new Thread(Producer).start();
new Thread(consumer).start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2