关于多线程的问题

m757266948 2016-11-19 10:59:36
class Clerk{
static int product;

public synchronized void consumeProduct(){

if(product<=0){
try {
wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}else{
System.out.println(Thread.currentThread().getName()+"消费产品:"+product);
product--;
notifyAll();
}
}


public synchronized void addProduct(){
if(product>20){
try {
wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}else{
product++;
System.out.println(Thread.currentThread().getName()+"生产产品"+product);
notifyAll();
}
}
}
class Consume extends Thread{
Clerk clerk;
public void run(){
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("消费商品");
while(true){
clerk.consumeProduct();
}

}
}

class Producer extends Thread{
Clerk clerk;
public void run(){
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("生产商品");
while(true){
clerk.addProduct();
}
}
}
public class TestProduceConsume {
public static void main(String[] args) {
Consume c1=new Consume();
Producer p1=new Producer();

c1.setName("消费者");
p1.setName("生产者");

c1.start();
p1.start();
}

}

运行出现异常为:
生产商品
消费商品
Exception in thread "生产者" Exception in thread "消费者" java.lang.NullPointerException
at com.atguigu.exer.Producer.run(TestProduceConsume.java:78)
java.lang.NullPointerException
at com.atguigu.exer.Consume.run(TestProduceConsume.java:61)

还请解释怎么修改
...全文
431 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
m757266948 2016-11-24
  • 打赏
  • 举报
回复
引用 8 楼 nmyangym 的回复:
class Consume extends Thread {
	Clerk clerk;
	//增加有参构造函数,参数就是Clerk对象。
	public Consume(Clerk clerk) {
		this.clerk = clerk;//给类的变量clerk赋值。
	}
	public void run() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		System.out.println("消费商品");
		while (true) {
			clerk.consumeProduct();
		}
	}
}

class Producer extends Thread {
	Clerk clerk;
	//增加有参构造函数,参数就是Clerk对象。
	public Producer(Clerk clerk) {
		this.clerk = clerk;//给类的变量clerk赋值。
	}
	public void run() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		System.out.println("生产商品");
		while (true) {
			clerk.addProduct();
		}
	}
}

public class TestProduceConsume {
	public static void main(String[] args) {
		/*
		 * new 一个Clerk 对象.
		 */
		Clerk clerk = new Clerk();
		//把clerk传递给c1,p1.
		Consume c1 = new Consume(clerk);
		Producer p1 = new Producer(clerk);

		c1.setName("消费者");
		p1.setName("生产者");

		c1.start();
		p1.start();
	}
}
Thanks
逗泥丸的平方 2016-11-22
  • 打赏
  • 举报
回复
引用 7 楼 m757266948 的回复:
[quote=引用 4 楼 qq_35209952 的回复:] 然后.....看起来 你的程序还有挺多问题的........
还是不会修改额。。。。怎么初始化???[/quote]

Clerk clerk = new Clerk();
你是其他语言转过来的吗. 建议先看看基础吧,还是不要急着写多线程.
nmyangym 2016-11-21
  • 打赏
  • 举报
回复
class Consume extends Thread {
	Clerk clerk;
	//增加有参构造函数,参数就是Clerk对象。
	public Consume(Clerk clerk) {
		this.clerk = clerk;//给类的变量clerk赋值。
	}
	public void run() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		System.out.println("消费商品");
		while (true) {
			clerk.consumeProduct();
		}
	}
}

class Producer extends Thread {
	Clerk clerk;
	//增加有参构造函数,参数就是Clerk对象。
	public Producer(Clerk clerk) {
		this.clerk = clerk;//给类的变量clerk赋值。
	}
	public void run() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		System.out.println("生产商品");
		while (true) {
			clerk.addProduct();
		}
	}
}

public class TestProduceConsume {
	public static void main(String[] args) {
		/*
		 * new 一个Clerk 对象.
		 */
		Clerk clerk = new Clerk();
		//把clerk传递给c1,p1.
		Consume c1 = new Consume(clerk);
		Producer p1 = new Producer(clerk);

		c1.setName("消费者");
		p1.setName("生产者");

		c1.start();
		p1.start();
	}
}
逗泥丸的平方 2016-11-21
  • 打赏
  • 举报
回复
然后.....看起来 你的程序还有挺多问题的........
逗泥丸的平方 2016-11-21
  • 打赏
  • 举报
回复
Thread.currentThread().sleep(100) 最好写成Thread.sleep(100) 你的写法就变成用对象来调用静态方法了. 空指针的问题如二楼所说..... clerk没初始化
m757266948 2016-11-21
  • 打赏
  • 举报
回复
引用 4 楼 qq_35209952 的回复:
然后.....看起来 你的程序还有挺多问题的........
还是不会修改额。。。。怎么初始化???
m757266948 2016-11-21
  • 打赏
  • 举报
回复
引用 1 楼 baidu_35198066 的回复:
你的 consumeProduct()和addProduct() 同步代码用的是同一个锁么。不好意思,我小白
不一样吧 要不然不是这个异常
m757266948 2016-11-21
  • 打赏
  • 举报
回复
引用 3 楼 qq_35209952 的回复:
Thread.currentThread().sleep(100) 最好写成Thread.sleep(100) 你的写法就变成用对象来调用静态方法了. 空指针的问题如二楼所说..... clerk没初始化
这不用静态方法调用没事吧?
baidu_35198066 2016-11-19
  • 打赏
  • 举报
回复
你的 consumeProduct()和addProduct() 同步代码用的是同一个锁么。不好意思,我小白
nmyangym 2016-11-19
  • 打赏
  • 举报
回复
Clerk clerk; 默认值是null,所以报“java.lang.NullPointerException”。

62,628

社区成员

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

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