黑马程序员技术交流社区
标题:
多线程疑惑
[打印本页]
作者:
杜加璇
时间:
2013-4-4 23:40
标题:
多线程疑惑
本帖最后由 杜加璇 于 2013-4-5 18:06 编辑
class Printer {
private int flag = 1;
private ReentrantLock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print1() throws Exception {
lock.lock();
if (flag != 1)
c1.await();
System.out.print("传");
System.out.print("智");
System.out.print("播");
System.out.print("客");
System.out.print("\r\n");
flag = 2;
c2.signal();
lock.unlock();
}
public void print2() throws Exception {
lock.lock();
if (flag != 2)
c2.await();
System.out.print("黑");
System.out.print("马");
System.out.print("程");
System.out.print("序");
System.out.print("员");
System.out.print("\r\n");
flag = 3;
c3.signal();
lock.unlock();
}
public void print3() throws Exception {
lock.lock();
if (flag != 3)
c3.await();
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;
c1.signal();
lock.unlock();
}
}这个程序里都是指定唤醒线程1唤醒2 线程2唤醒3 线程3唤醒1 那这个if()判断不就没意义了吗为什么还要加上呢
作者:
刘印12
时间:
2013-4-5 00:13
这个问题我也想知道
作者:
赵家阳
时间:
2013-4-5 00:44
本帖最后由 赵家阳 于 2013-4-5 00:46 编辑
楼主:我先问你个问题,你这个类一没有继承Thread类,二没有实现Runnable接口,怎么开启多线程?如果你new三个对象,那么他们谁也无法干预另外的两个对象。
2,这个判断语句的作用还是蛮大的。加上去,他们就能按照一个顺序来回转。
如果没有加,前提是你用正确的方法开启了三个线程,在没有if语句的情况下,不管他们谁先运行,都会进入await();状态,谁也不会唤醒另外一个。
此时,这三个家伙,就只能等啊等啊等啊等啊等啊等啊等啊。。。。。
作者:
田光峰
时间:
2013-4-5 13:23
class Printer {
private int flag = 1;
private ReentrantLock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print1() throws Exception {
lock.lock();
if (flag != 1)
c1.await();
System.out.print("传");
System.out.print("智");
System.out.print("播");
System.out.print("客");
System.out.print("\r\n");
flag = 2;
c2.signal();
lock.unlock();
}
public void print2() throws Exception {
lock.lock();
if (flag != 2)
c2.await();
System.out.print("黑");
System.out.print("马");
System.out.print("程");
System.out.print("序");
System.out.print("员");
System.out.print("\r\n");
flag = 3;
c3.signal();
lock.unlock();
}
public void print3() throws Exception {
lock.lock();
if (flag != 3)
c3.await();
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;
c1.signal();
lock.unlock();
}
}
如果没有if判断语句就会不分原由的进入等待状态,几个线程都会进入等待状态,如果加以判断就可以保证一个线程可以执行
就算其他线程拿到执行权因为数字不匹配就会进入等待状态。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2