黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
揭耀祖
时间:
2012-5-27 15:50
标题:
多线程问题
本帖最后由 jxj4227982333 于 2012-5-27 15:59 编辑
今天在复习多线程这块时发现了个小问题,是关于多线程间通信的。如下:
class Input implements Runnable
{
Res r;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized(r) //当input持有锁进入后,output 是不能够进入同步代码块的,当然我的假设
{ //是input先持有锁进来的output还没来的及判断锁更没有进入等待状态。
if(r.flag)
try{r.wait();}catch(Exception e){} //当input线程执行到这时,进入了等待状态后,它还持有锁啊,
if(x==0) //output线程为什么还能够执行?难道是input进入等待状态
{ //后,不仅放弃了执行权,锁也不持有了吗 ?
r.name = "小明";
r.sex = "男男男男男男";
}
else
{
r.name = "rose";
r.sex = "female";
}
x=(x+1)%2;
r.flag = true;
r.notify();
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
class Output implements Runnable
{
Res r;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r) //当input持有锁在执行的时候甚至进入等待状态后,output很可能还没有进入同步代码块啊
{
if(!r.flag)
try{r.wait();}catch(Exception e){}
System.out.println(r.name+"...."+r.sex);
r.flag = false ;
r.notify();
}
}
}
}
复制代码
我的问题都写在上面的注释里面了,谁来帮我把思路捋捋顺。
作者:
袁培育
时间:
2012-5-27 16:35
当多个线程使用同一个监视器时,如果某个线程先拿到监视器则其他线程无法进入同步代码块,但如果得到监视器的线程等待时即进入wait状态时不仅放弃了cpu执行权,同时还放弃了锁,这时其他线程就可以执行了,如果有个线程把wait的线程叫醒了的话它一旦获得cpu执行权就会开始执行,因为他已经进入同步代码块内部,不用再管锁在谁手里了。
作者:
黄奕豪
时间:
2012-5-27 17:17
class Duo
{
public static void main(String[] args)
{
Res r = new Res();
Thread t1 = new Thread(new Input(r));
Thread t2 = new Thread(new Output(r));
t1.start();
t2.start();
}
}
class Res
{
boolean flag = false;
String name;
String sex;
}
class Input implements Runnable
{
Res r;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized(r) //当input持有锁进入后,output 是不能够进入同步代码块的,当然我的假设
{ //是input先持有锁进来的output还没来的及判断锁更没有进入等待状态。
if(r.flag)
try{r.wait();}catch(Exception e){} //当input线程执行到这时,进入了等待状态后,它还持有锁啊,
if(x==0) //output线程为什么还能够执行?难道是input进入等待状态
{ //后,不仅放弃了执行权,锁也不持有了吗 ?
r.name = "小明";
r.sex = "男男男男男男";
}
else
{
r.name = "rose";
r.sex = "female";
}
x=(x+1)%2;
r.flag = true;
r.notify();
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
class Output implements Runnable
{
Res r;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r) //当input持有锁在执行的时候甚至进入等待状态后,output很可能还没有进入同步代码块啊
{
if(!r.flag)
try{r.wait();}catch(Exception e){}
System.out.println(r.name+"...."+r.sex);
r.flag = false ;
r.notify();
}
}
}
}
复制代码
好吧,楼主,我必须说如果按照我加上的代码的话应该没问题,但是如果你在主函数里面是这样写的话就有问题了
class Duo
{
public static void main(String[] args)
{
//Res r = new Res();
Thread t1 = new Thread(new Input(new Res()));
Thread t2 = new Thread(new Output(new Res()));
t1.start();
t2.start();
}
}
复制代码
如果是这样的话,两个线程根本不是用同样的锁,线程当然都可以各执行各的了!!楼主,是你调用的问题吧?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2