黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
杜加璇
时间:
2013-3-30 20:40
标题:
多线程问题
本帖最后由 杜加璇 于 2013-3-31 19:11 编辑
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循环将是个死循环 那为什么还会执行呢?
求大神解释。
作者:
陈腾跃_2013
时间:
2013-3-30 21:41
能提供下main函数看看你是怎么调用printer类的吗?
你只是定义了同步函数,并不涉及Runnable的范畴呢!
作者:
李红志
时间:
2013-3-31 00:42
if 是分支语句 ;while是循环语句。分支语句要判断条件是否满足。
这个程序也不是随机执行的,因为初值是1,所以 (flag != 1) 的结果是false所以不执行 wait();而执行后面的语句即打印出传智播客,flag变成2,同理执行print2,print3.
若用while,道理也是一样的。
作者:
陈丽莉
时间:
2013-3-31 18:45
若还有问题,请继续追问~ 没有的话,请将帖子分类改成【已解决】~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2