`
vbf_sr
  • 浏览: 1446 次
  • 性别: Icon_minigender_2
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

在生产消费者模式中,为什么wait()要放在while循环中,而不是if()?

    博客分类:
  • Java
阅读更多
public synchronized void showBlackStars() {
// TODO Auto-generated method stub
while(!flag){
try {
System.out.println(Thread.currentThread().getName()+"aa@@");
this.wait();
System.out.println(Thread.currentThread().getName()+"1111");

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"@@@@@@@@");
flag = false;
this.notifyAll();
}
当执行wait()时,会释放锁。
A1执行showBlackStars()时,线程阻塞,释放掉锁。A2执行showA()方法。同样被阻塞。
当B1执行showB时,notifyall会唤醒A1和A2。
唤醒后的线程会继续执行接下来的程序,那么它将继续执行while循环。此时flag为true,继续wait。如果是if那么唤醒的A1会继续执行。新的线程A3也会执行这段代码。就会打印出两行@@@@@@@

  
分享到:
评论

相关推荐

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    在使用`pthread_cond_wait()`时,通常会在调用它之前加入一个while循环来判断条件是否满足。这个做法是为了避免虚假唤醒(spurious wakeups)的问题,确保线程只有在正确的情况下才会继续执行。现在我们详细讨论一下...

    生产者和消费者模式多线程

    在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免数据竞争,我们需要通过线程同步机制来协调两者的行为。 在Java中,我们可以使用`java.util.concurrent`包中的工具...

    Java 生产消费者模式

    在这个模式中,生产者负责生成数据,而消费者则负责消费这些数据。它基于“缓冲区”概念,即一个有限大小的数据存储区域,生产者将产品放入缓冲区,而消费者从中取出产品。这种模式有效地避免了生产者与消费者之间的...

    Java JDK1.5 生产消费者模式解决方案

    在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...

    Python程序设计:while循环.pptx

    在编程中,`while`循环是一种重要的控制流程结构,它允许程序反复执行一段代码,直到指定的条件不再满足。在虚拟减肥跑步机任务中,`while`循环被用于实现用户输入体重、跑步速度、运动时长等参数,并实时更新跑步...

    android 生产者消费者模式

    在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...

    面试官:你是如何调用 wait()方法的?使用 if 块还是循环?为什么?

    在实际编程中,`wait()`、`notify()`和`notifyAll()`通常与生产者消费者模型、条件变量等并发设计模式相结合使用。它们是Java并发库的基础,理解其工作原理和使用方式对于编写高性能、高并发的Java应用程序至关重要...

    循环练习题if、while、do-while、switch

    - **累加求和**: 在循环内部使用变量记录累计的和。 - **条件终止**: 循环的终止条件通常由循环外部的条件判断决定。 ### 5. for 循环的高级应用 示例中展示了如何使用 for 循环打印特定格式的字符串。 ```plain...

    典型while循环实例

    `if`语句可以用来在循环内部有条件地执行或跳过某些代码。`break`语句用于立即退出整个循环,而`continue`语句则会跳过当前循环体剩余的部分,直接进入下一次循环。 例如,如果我们想在上述循环中找到第一个偶数并...

    Java中while循环语句实例.pdf

    1. **死循环**:如果条件表达式始终为真,那么while循环会形成一个无限循环,导致程序无法停止,这通常不是我们想要的结果。在编写while循环时,必须确保存在某种方式使条件变为假,以避免死循环。 2. **循环变量**...

    js while循环语句

    它可以在开始执行循环前立即检查条件,这使得它适用于那些条件在循环开始时未知或可能在每次迭代中改变的情况。例如,假设我们要打印从1到5的数字,可以这样使用`while`循环: ```javascript let i = 1; while (i )...

    简单的 while 循环

    为了防止无限循环,通常需要在循环体内修改控制循环的变量,如上例中的`count`。 此外,`while`循环还可以与其他控制结构结合使用,如`if`语句和`break`、`continue`语句。`break`语句用于立即退出整个循环,无论...

    生产者消费者的c++代码实现

    在生产者线程中,我们使用 while 循环来不断地生产物品,并将其放置在缓冲区中。当缓冲区满时,生产者线程将等待消费者线程释放出一个空缓冲区。在消费者线程中,我们使用 while 循环来不断地消费物品,并释放缓冲区...

    for while dowhile_javado-while循环_

    for循环适用于已知循环次数的情况,while循环适用于循环次数不确定但能根据条件判断的情况,而do-while循环则保证了循环体至少执行一次,无论条件是否在开始时就为假。理解并熟练掌握这三种循环结构,将有助于编写出...

    生产者消费者问题c++实现

    在这个示例中,我们创建了两个无限循环的线程——生产者和消费者。生产者在缓冲区满时等待,而消费者在缓冲区空时等待。当生产者完成生产或消费者完成消费后,它们会解锁缓冲区并唤醒等待的线程,确保线程间的同步。...

    c语言实现while循环if判断.zip

    在这个例子中,我们首先用while循环遍历整个数组,然后在循环体内使用if判断来检查当前元素是否是我们要找的目标。如果找到了,就跳出循环;如果没有找到,循环结束后还会有一个if判断来确认这个结果。 在提供的...

    Java中continue在while循环中的应用.pdf

    在循环体内,通过`if`语句判断`i`是否为奇数,如果`i`是奇数,`continue`语句会被执行,跳过这次循环的剩余部分,即不会执行`sum=sum+i;`这一行。这样,只有当`i`为偶数时,才会累加到`sum`中。当`i`达到11,`while`...

    while循环练习示例

    在实际应用中,我们通常需要在循环体内修改某些变量,确保循环能够在适当的时候停止,避免陷入无限循环。 "while循环练习示例"这个资源提供了一个学习和实践while循环的机会。通过分析和运行其中的代码,我们可以...

    3.while循环.pptx

    while循环结构的优点是可以根据实际情况来控制循环的次数,而不是固定的次数。例如,计算1+2+3+……+n的和,可以使用while循环结构来实现。 while循环结构的应用场景包括: * 需要大量重复的运算或者操作,而又不...

    java多线程之消费者生产者模式参照.pdf

    3. **同步控制**:`push()`和`pop()`在执行前都会通过`while`循环检查条件,避免了消费者在栈为空时尝试消费,或者生产者在栈满时继续生产的情况。在满足条件后,调用`notify()`方法唤醒等待的线程,但只是将其置于...

Global site tag (gtag.js) - Google Analytics