黑马程序员技术交流社区
标题:
代码和视频上的一样,为什么结果不一样?
[打印本页]
作者:
nyk
时间:
2014-10-24 01:25
标题:
代码和视频上的一样,为什么结果不一样?
本帖最后由 nyk 于 2014-10-24 17:35 编辑
public class ProducerConsumerDemo {
public static void main(String[] args){
Resource r = new Resource();
Producer pro = new Producer(r);
Consumer con = new Consumer(r);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
t1.start();
t2.start();
}
}
class Resource{
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void set(String name){
if(flag)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.name = name + "--" + count++;
System.out.println(Thread.currentThread().getName() + "--producer--" + this.name);
flag = true;
this.notify();
}
public synchronized void out(){
if(!flag)
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--consumer---------------" + this.name);
flag = false;
notify();
}
}
class Producer implements Runnable{
private Resource r;
public Producer(Resource r){
this.r = r;
}
public void run(){
while(true){
r.set("conduct");
}
}
}
class Consumer implements Runnable{
private Resource r;
public Consumer(Resource r){
this.r = r;
}
public void run(){
r.out();
}
}
复制代码
运行结果为
Thread-0--producer--conduct--1
Thread-1--consumer---------------conduct--1
Thread-0--producer--conduct--2
复制代码
这是什么问题卡住了?应该是两个线程交替出现啊
作者:
nyk
时间:
2014-10-24 15:18
自己顶一顶,现在还没想通啊,有大神知道吗?
作者:
qq8921310
时间:
2014-10-24 15:45
你给的结果不是交替了么?
作者:
Mr.Ni
时间:
2014-10-24 16:03
public void run()
{
r.out();//这里消费者你没有循环啊,当然只消费一次咯
}
作者:
cxdzh
时间:
2014-10-24 16:34
Consumer 方法中
r.out()没有循环,只运行了一次
作者:
Dream.
时间:
2014-10-24 16:40
楼上终结
作者:
Eagle
时间:
2014-10-24 16:43
我也正在学这里。这是我的代码。可以参考参考。嘿嘿。有机会一起交流
//producer:生产者,制片人 consumer:消费者,用户
class ProducerConsumerDemo
{
public static void main(String[] args)
{
//创建resource对象
Resource res = new Resource();
//创建producer对象
Producer pro = new Producer(res);
//创建Consumer对象
Consumer con = new Consumer(res);
//创建4个线程
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
Thread t3 = new Thread(pro);
Thread t4 = new Thread(con);
//启动四个线程
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//resource:资源
class Resource
{
//私有的产品名称
private String name;
//私有的计数器,产品编号
private int count = 1;
//布尔型变量,用于判断线程要执行哪里
private boolean flag = false;
//加同步锁的set,设置产品名称的方法。
public synchronized void set(String name)
{
while(true)
{
//判断flag是否真
// if (flag)
//while循环判断,当线程被解除冻结后需要回来再判断一次
while (flag)
{
//wait:等待,把当前线程冻结起来。等待notify(通知,告知)唤醒,notifyAll:唤醒全部线程
try{wait();}catch(Exception e){}
}
//把传入的name加上计数器赋值给本类的name
this.name = name+"+==+"+count++;
//打印当前线程name和当前生产者的name
System.out.println(Thread.currentThread().getName()+".生产者.SS."+this.name);
//把flag的值改为true。
flag = true;
//唤醒第一个冻结的线程
// this.notify();
//唤醒所有线程
this.notifyAll();
}
}
//输出函数,输出产品名称和编号
public synchronized void out()
{
while(true)
{
//if判断flag是否为false,线程被唤醒后继续执行,不再回来判断
// if (!flag)
//while循环判断,当线程被解除冻结后需要回来再判断一次
while (!flag)
{
//flag为false时,线程进入等待状态,没有执行资格,等待唤醒
try{wait();}catch(Exception e){}
}
//打印当前线程名称和购买者名称
System.out.println(Thread.currentThread().getName()+".购买者.GOGOGO."+this.name);
//修改flag的值为false;
flag = false;;
//唤醒最先冻结的线程
// this.notify();
//唤醒所有线程
this.notifyAll();
}
}
}
//创建类producer,实现多线程Runnable接口。
class Producer implements Runnable
{
//建立resource引用
private Resource res;
//初始化引用
Producer(Resource res)
{
//把引用指向类resource
this.res = res;
}
//复写run方法
public void run()
{
// while(true)
// {
//调用set函数,对产品名称进行设置
res.set("雀氏挖掘机");
// }
}
}
class Consumer implements Runnable
{
//建立引用
private Resource res;
//初始化
Consumer(Resource res)
{
//res赋值
this.res = res;
}
//复写run函数
public void run()
{
// while(true)
// {
//调用out函数。
res.out();
// }
}
}
复制代码
作者:
nyk
时间:
2014-10-24 17:35
明白了,太粗心了。感谢各位
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2