黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
yangyinhui
时间:
2013-4-5 21:02
标题:
多线程问题
本帖最后由 yangyinhui 于 2013-4-6 18:20 编辑
import java.util.concurrent.locks.*;
class Demo4_Notify {
public static void main(String[] args) {
final Printer p = new Printer();
new Thread() {
public void run() {
while (true)
// 一直执行
try {
p.print1();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
public void run() {
for (int i = 0; i < 5; i++)
// 指定执行的次数
try {
p.print2();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
class Printer {
private int flag = 1;
private ReentrantLock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
public void print1() throws Exception {
lock.lock();
if (flag != 1)
c1.await();
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("\r\n");
flag = 1;
c1.signal();
lock.unlock();
}
}
复制代码
这段代码我让一个线程为while (true)一个为for (int i = 0; i < 5; i++)程序执行后结果为但是程序却没有停止也不输出了,为什么啊?为什么不是输出5个大家好后一直输出你好啊?
你好
大家好
你好
大家好
你好
大家好
你好
大家好
你好
大家好
你好
作者:
田光峰
时间:
2013-4-5 21:53
public void print1() throws Exception {
lock.lock();
if (flag != 1)
c1.await();
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("\r\n");
flag = 1;
c1.signal();
lock.unlock();
}
当五次for循环执行完后就是执行while(true)中的语句
lock.lock();
if (flag != 1)
c1.await();
System.out.print("你好");
System.out.print("\r\n");
flag = 2;
c2.signal();
lock.unlock();
这时 flag = 2;而输出 “你好” 需要 flag = 1;所以“你好”就不能再输出了,既是线程1就不能执行,会进入等待状态。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2