黑马程序员技术交流社区
标题:
多线程通信问题
[打印本页]
作者:
杜加璇
时间:
2013-3-30 20:35
标题:
多线程通信问题
本帖最后由 杜加璇 于 2013-3-31 19:10 编辑
class Printer {
private int flag = 1;
public synchronized void print1() throws Exception {
if (flag != 1)
wait();
System.out.print("传");
System.out.print("智");
System.out.print("播");
System.out.print("客");
System.out.print("\r\n");
flag = 2;
notifyAll();
}
public synchronized void print2() throws Exception {
if (flag != 2)
wait();
System.out.print("黑");
System.out.print("马");
System.out.print("程");
System.out.print("序");
System.out.print("员");
System.out.print("\r\n");
flag = 3;
notifyAll();
}
public synchronized void print3() throws Exception {
if (flag != 3)
wait();
System.out.print("i");
System.out.print("t");
System.out.print("c");
System.out.print("a");
System.out.print("s");
System.out.print("t");
System.out.print("\r\n");
flag = 1;
notifyAll();
}
}
这个程序为什么用if 是随机唤醒执行而用while是线程1,2,3 顺序唤醒执行呢?
假设用if时 先执行线程1 ,线程1唤醒线程3这时flag是2, 2!=3;线程3执行wait会继续沉睡,直到cpu切换到线程2时才会正常执行 ;同理线程2执行后,直到cpu切换到线程2时才会正常执行
照这个思路 用if时 会是按照线程1,2,3顺序执行的。而用while时也是假设先执行线程1 ,线程1唤醒线程3这时flag是2,那么线程3的while循环将是个死循环 那为什么还会执行呢?
求大神解释。
作者:
HM朱蛟
时间:
2013-3-30 23:22
楼主你好 没明白你的意思 不知道我的代码和你的代码是不是一样的
class Printer
{
private int flag = 1;
public synchronized void print1() throws Exception
{
while(flag != 1) // 1!=1 FALSE
wait(); // thread_1--> flag=2
System.out.println(Thread.currentThread().getName()+"传智播客");
System.out.print("\r\n");
flag = 2;
notifyAll();
}
public synchronized void print2() throws Exception
{
while(flag != 2)
wait();
System.out.println(Thread.currentThread().getName()+"黑马程序员");
System.out.print("\r\n");
flag = 3;
notifyAll();
}
public synchronized void print3() throws Exception
{
while(flag != 3)
wait();
System.out.println(Thread.currentThread().getName()+"itcast");
System.out.print("\r\n");
flag = 1;
this.notifyAll();
}
}
class Temp implements Runnable
{
Printer p = new Printer();
public void run()
{
try{p.print1();}catch (Exception e) {}
try{p.print2();}catch (Exception e) {}
try{p.print3();}catch (Exception e) {}
}
}
class Run
{
public static void main(String [] args)
{
Temp t = new Temp();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();
t2.start();
t3.start();
}
}
复制代码
作者:
HM朱蛟
时间:
2013-3-30 23:29
我只是觉得若是这样的代码 用if和while没啥区别啊 LZ把你的全部代码贴上来看看呢
作者:
李红志
时间:
2013-3-31 00:55
你理解错了 。这个问题中if和while没有区别。
作者:
万蕾
时间:
2013-3-31 17:13
我来帮你理解一下吧:
假设先执行线程2和3呢?你有没有想过,这样2和3同时等待,执行完1后,是不是就没有连续性可言了呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2