黑马程序员技术交流社区
标题:
关于多线程生产者和消费者中while循环中flag标记位的问题
[打印本页]
作者:
吴杰栋
时间:
2014-8-3 23:50
标题:
关于多线程生产者和消费者中while循环中flag标记位的问题
package cn.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Res{
public String name;
public int count = 1;
boolean flag = false;
Lock lock = new ReentrantLock();
Condition conIn = lock.newCondition();
Condition conOut = lock.newCondition();
public void in(String name){
lock.lock();
try{
while(flag)
try {
conIn.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.name = name + count;
System.out.println(Thread.currentThread().getName()+"生产..."+ this.name);
count++;
flag = true;
conOut.signal();
}finally{
lock.unlock();
}
}
public void out(){
lock.lock();
try{
while(!flag)
try {
conOut.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"出售......"+this.name);
flag = false;
conIn.signal();
}finally{
lock.unlock();
}
}
}
class Producer implements Runnable{
Res r;
public Producer(Res r){
this.r = r;
}
public void run(){
while(true){
r.in("CX-5-->");
}
}
}
class Consumer implements Runnable{
Res r;
public Consumer(Res r){
this.r = r;
}
public void run(){
while(true){
r.out();
}
}
}
public class ProducerConsumer {
public static void main(String[] args) {
Res r = new Res();
Producer p = new Producer(r);
Consumer c = new Consumer(r);
Thread t1 = new Thread(p);
Thread t2 = new Thread(p);
Thread t3 = new Thread(c);
Thread t4 = new Thread(c);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
在while中的标记位flag是怎么判断的?
我的理解是:flag的默认是false的,这个时候没有东西在,这个时候生产东西,生产好了就false变ture,说明有东西了
然后到消费,while中的!flag是false,那这样不就是下面消费的代码执行不到了?这里我卡住了,求解答
作者:
尘埃落定
时间:
2014-8-4 08:57
①while(!flag)
try {
conOut.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
②System.out.println(Thread.currentThread().getName()+"出售......"+this.name);
flag = false;
conIn.signal();
复制代码
我有截取部分代码,请注意我标注的两个地方,当①处为false,while循环不执行,但是会接着执行下面的语句,如我②处标示的位置,
因为上面有生产,生产后flag变TRUE,这个时候就只能消费(在代码中是以输出体现的),所以,要跳过while循环,直接读输出语句。
消费后(输出后)flag会变成FALSE,这个时候,如果还是此线程继续执行,就会读到while(!flag)循环,此时,!flag为TRUE,则会
运行循环中的代码,让此线程await()。这样楼主能明白了吧:)
作者:
阿温
时间:
2014-8-4 09:37
到消费,while中的!flag是false,那这样不就是下面消费的代码执行不到了?
不是的,while后面没有花括号,while循环范围只有try catch,正是因为不try await,才执行到了下面的消费代码
作者:
刘高峰
时间:
2014-8-4 11:52
楼上正解,注意while后面没有括号,while的循环体只有try catch 部分
作者:
吴杰栋
时间:
2014-8-4 20:27
尘埃落定 发表于 2014-8-4 08:57
我有截取部分代码,请注意我标注的两个地方,当①处为false,while循环不执行,但是会接着执行下面的语句 ...
binggo,我在while循环中,哪部分是循环体,没有弄明白,这下明白了,谢谢哈
作者:
Vaz
时间:
2014-8-4 21:31
多线程还没学到,。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2