黑马程序员技术交流社区
标题:
关于多线程的一个程序
[打印本页]
作者:
夏凡
时间:
2013-5-2 22:02
标题:
关于多线程的一个程序
本帖最后由 夏凡 于 2013-5-8 19:19 编辑
程序运行时报错,寻求高手解答,谢谢!
import java.util.concurrent.locks.*;
class Goods
{
private String name;
private int num = 200;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void setInfo(String name) throws InterruptedException//因为没写catch
{
lock.lock();
try
{
while(flag)
{
condition_pro.await();
}
this.name = name+"----"+num--;
System.out.println(Thread.currentThread().getName() + "----生产者----" + this.name);
this.flag = true;
condition_con.signal();
}
finally
{
lock.unlock();
}
}
public void getInfo()throws InterruptedException
{
try
{
while(!flag)//此处需要用到while,循环判断
{
condition_con.await();
}
System.out.println(Thread.currentThread().getName() + "----消费者----" + this.name);
this.flag = false;
condition_pro.signal();
}
finally
{
lock.unlock();
}
}
}
class Producer implements Runnable//创建线程
{
private Goods apple;
Producer(Goods apple_ipad)//有什么用啊?
{
apple = apple_ipad;
}
public void run()
{
while(true)
{
try
{
apple.setInfo("苹果");
}
catch (InterruptedException e)
{
}
}
}
}
class Consumer implements Runnable
{
private Goods apple;
Consumer(Goods apple_ipad)
{
apple = apple_ipad;
}
public void run()
{
while(true)
{
try
{
apple.getInfo();
}
catch (InterruptedException e)
{
}
}
}
}
class ProducerConsumer2
{
public static void main(String[] args)
{
Goods ipad4 = new Goods();
Producer p = new Producer(ipad4);
Consumer c = new Consumer(ipad4);
Thread tp1 = new Thread( p, "factory1");
Thread tp2 = new Thread( p, "factory2");
Thread tc1 = new Thread(c, "buyer1");
Thread tc2 = new Thread(c, "buyer2");
tp1.start();
tp2.start();
tc1.start();
tc2.start();
}
}
复制代码
作者:
爪哇攻城狮
时间:
2013-5-3 20:29
Producer(Goods apple_ipad)//有什么用啊?
{
apple = apple_ipad;
}
有参构造函数,给apple初始化
作者:
黑马伍哲沂
时间:
2013-5-3 22:47
程序 第36行 少一句:lock.lock();{:soso_e127:}
作者:
夏凡
时间:
2013-5-8 09:32
李松柏 发表于 2013-5-3 20:29
Producer(Goods apple_ipad)//有什么用啊?
{
apple = apple_ipad;
我的问题主要不是这,是这个程序运行会报错,还是谢谢你
作者:
刘学明
时间:
2013-5-8 10:30
import java.util.concurrent.locks.*;
class Goods
{
private String name;
private int num = 200;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void setInfo(String name) throws InterruptedException//因为没写catch
{
lock.lock();
try
{
while(num>1)
{
while(flag)
{
condition_pro.await();
}
this.name = name+"----"+num--;
System.out.println(Thread.currentThread().getName() + "----生产商----" + this.name);
this.flag = true;
condition_con.signal();
}
if(num==0){
System.out.println(name+"产品已经生产完毕!");
System.exit(0);
}
}
finally
{
lock.unlock();
}
}
public void getInfo()throws InterruptedException
{
lock.lock();// 消费商品这没有上锁!
try
{
while(!flag)//此处需要用到while,循环判断
{
condition_con.await();
}
System.out.println(Thread.currentThread().getName() + "----消费者----" + this.name);
this.flag = false;
condition_pro.signal();
}
finally
{
lock.unlock();
}
}
}
class Producer implements Runnable//创建线程
{
private Goods apple;
Producer(Goods apple_ipad)//有什么用啊? // 将产品对象Goods传入到生产商 ,对Goods进行生产。
{
apple = apple_ipad;
}
public void run()
{
while(true)
{
try
{
apple.setInfo("苹果");
}
catch (InterruptedException e)
{
}
}
}
}
class Consumer implements Runnable
{
private Goods apple;
Consumer(Goods apple_ipad)
{
apple = apple_ipad;
}
public void run()
{
while(true)
{
try
{
apple.getInfo();
}
catch (InterruptedException e)
{
}
}
}
}
class ProducerConsumer2
{
public static void main(String[] args)
{
Goods ipad4 = new Goods();
Producer p = new Producer(ipad4);
Consumer c = new Consumer(ipad4);
Thread tp1 = new Thread( p, "factory1");
Thread tp2 = new Thread( p, "factory2");
Thread tc1 = new Thread(c, "buyer1");
Thread tc2 = new Thread(c, "buyer2");
tp1.start();
tp2.start();
tc1.start();
tc2.start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2