黑马程序员技术交流社区
标题:
多线程问题。。。。
[打印本页]
作者:
郑枫
时间:
2012-8-1 16:38
标题:
多线程问题。。。。
import java.util.concurrent.locks.*;
class Res
{
private String name;
private int nex = 1;
private boolean fiag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void set (String name)throws InterruptedException
{
lock.lock(); //加锁
try
{
while (fiag)
condition_pro.await();//set 的等待
this.name = name+" "+nex++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
fiag = true;
condition_con.signal(); //唤醒对方的等待
}
finally
{
lock.unlock(); //释放锁。 这个动作一定执行
}
}
public void out ()throws InterruptedException
{
lock.lock(); //加锁
try
{
while(!fiag);
condition_con.await();
System.out.println(Thread.currentThread().getName()+"... 消费者 .."+this.name);
fiag = false;
condition_pro.signal();
}
finally
{
lock.unlock();//释放锁。 这个动作一定执行
}
}
}
class Producer implements Runnable
{
private Res r;
Producer (Res r)
{
this.r = r;
}
public void run()
{
while (true)
{
try
{
r.set("商品");
}
catch (InterruptedException e)
{
}
}
}
}
class Demo implements Runnable
{
private Res r;
Demo(Res r)
{
this.r = r;
}
public void run()
{
while (true)
{
try
{
r.out();
}
catch (InterruptedException e)
{
}
}
}
}
class ProducerDemo4
{
public static void main (String [] asge)
{
Res r = new Res();
Producer pro = new Producer(r);
Demo de = new Demo(r);
Thread a1 = new Thread(pro);
Thread a2 = new Thread(pro);
Thread a3 = new Thread(de);
Thread a4 = new Thread(de);
a1.start();
a2.start();
a3.start();
a4.start();
}
}
复制代码
我要崩溃了 求高人能看看哪里错了。
运行结果是
Thread-0...生产者.. 商品 1
之后就卡那里了。。
作者:
金龙
时间:
2012-8-1 17:07
class Res
{
private String name;
private int nex = 1;
private boolean fiag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void set (String name)throws InterruptedException
{
lock.lock(); //加锁
try
{
while (fiag)
condition_pro.await();//set 的等待
this.name = name+" "+nex++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
fiag = true;
condition_con.signal(); //唤醒对方的等待
}
finally
{
lock.unlock(); //释放锁。 这个动作一定执行
}
}
public void out ()throws InterruptedException
{
lock.lock(); //加锁
try
{
while(!fiag);//
问题出在这里,你的while循环后面跟了一个分号。所以默认方法体为空,线程一直在做死循环。分号去掉即可
condition_con.await();
System.out.println(Thread.currentThread().getName()+"... 消费者 .."+this.name);
fiag = false;
condition_pro.signal();
}
finally
{
lock.unlock();//释放锁。 这个动作一定执行
}
}
}
作者:
郑枫
时间:
2012-8-1 20:53
{:soso_e136:} 我晕 {:soso_e179:} 万分感谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2