黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: ztwztw    时间: 2013-12-17 09:03
标题: 多线程问题
class ProducecomsumerDemo
{
public static void main (Sting[] args)
{
Resource r=new Resource;
Produce pro=new Produce;
Consumer con=new Consumer;
Consumer t1=new Consumer(pro);
Consumer t2=new Consumer(pro);
Consumer t3=new Consumer(con);
Consumer t4=new Consumer(com);
t1,start;t2,start;t1,start;t1,start;
}
}
class Ressource
{
private sting name;
private int count=1;
private boolean flag=flase;
public synchronized void set (String name)
{
if(flag)
{
try(this.wait());
catch(Exception e){};
this.name=name+"......."+coun++;
system.out.println(this.getName()+"....生产者...."+this.name)
flag=ture;
this.notify();
}
}
}
  public synchronized void out()
{
if(!flag)
{
try(this.wait());
catch(Exception e){};

syetem.out.println(this.getName+"....消费者...."+this.name)
flag=flase;
this.notify;
}    }     
  class Prodncer implements Runable
{
private Resource res;
Producer (Resource res)
this.res=res;
public void run
{
while (true)
{res,set("...+商品...");
}
}
}   
class Consumer implements Runable
{
private Resource res;
Producer (Resource res)
this.res=res;
public void run
{
while (true)
{
res,out();
}
}
}   
在这个多线程中的同步函数中,如果t1进去执行了,出来的时候,flag变为ture,唤醒。这个时候如果t1还有执行权,去判断flag=true。等待。这个时候t2能进入同步函数中判断flag吗。                                                               

作者: smileven    时间: 2013-12-18 02:14
你说的情况应该是这样的:
当t1生产者生产完一个产品后,唤醒消费者去消费。
然后消费者消费掉这个产品后,唤醒生产者继续生产。
但是此时生产者有t1和t2,他们要争夺CPU资源,谁抢到CPU执行权谁就进行生产。
这是t1抢到了CPU执行权,但是当t1进入同步代码块的时候wait()了,不能继续生产。
同步代码块的锁是this锁,t1和t2是不同的生产对象,他们的this肯定也就不一样了。
这个时候整个同步代码块的锁是t1对象的this锁,t2对象的有自己的this锁,所以这个时候t2肯定是不能进入这个同步代码块的。
作者: 75100313    时间: 2013-12-18 08:39
本帖最后由 75100313 于 2013-12-18 08:44 编辑

注释 是多么重要啊  你都不写注释  格式也没有  让我们新人怎么学啊
作者: 程洋    时间: 2013-12-18 09:00
可以的.
wait()方法:释放cpu执行权的同时也会释放锁;
sleep()方法只是放cpu执行权,不释放锁。
所以t1等待时会释放锁,t2是可以进来的.






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2