`
fanrey
  • 浏览: 254967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java synchronized实例 -- Hungry Bird

    博客分类:
  • JAVA
 
阅读更多
Given are n baby birds and one parent bird. The baby birds eat out of a common dish that initially contains W worms. Each baby bird repeatedly takes a worm, eats it, sleeps for a while, takes another worm, and so on. If the dish is empty, the baby bird who discovers the empty dish chirps real loud to awaken the parent bird. The parent bird flies off and gathers W more worms, puts them in the dish, and then waits for the dish to be empty again. This pattern repeats forever.
Represent the birds as concurrent threads (i.e. array of "baby bird" threads and a "parent bird" thread), and the dish as a concurrent object (a monitor) that can be accessed by at most one bird at a time. 

Develop a monitor (with condition variables) to synchronize the actions of the birds, i.e. develop a monitor that represents the dish. Define the monitor's operations and their implementation. Implement a multithreaded application in Java to simulate the actions of the birds represented as concurrent threads and the dish represented as as the monitor. Is your solution fair? Explain in comments in the source code.


import java.util.ArrayList;
import java.util.List;

public class HungryBirds2
{
public static List<String> wormBuffer = new ArrayList<String>();

public static int WORM_NUMBER = 10;
public static int BIRD_NUMBER = 5;

public static Object birdLock = new Object();
public static Object wormLock = new Object();

public static void main(String[] args)
{

FatherBird producer = new FatherBird();
producer.start();

for ( int i=0; i<BIRD_NUMBER; i++ )
{
BabyBird consumer = new BabyBird(i);
consumer.start();
}


}
}

class MotherBird extends Thread
{
public MotherBird()
{
}

public void run()
{
while (true)
{



synchronized(HungryBirds2.wormLock){
List<String> buffer = HungryBirds2.wormBuffer;
if(buffer.isEmpty()){
for(int i=0; i<HungryBirds2.WORM_NUMBER; i++){
String worm = "Worm " + i;
buffer.add( worm );
}
System.out.println("Parent bird produced worms! Worm number is " + buffer.size() + "!");
}
synchronized(HungryBirds2.birdLock){
try {
HungryBirds2.birdLock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

try
{
Thread.sleep( 1000 );
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

class KidBird extends Thread
{
private int id;

public KidBird( int id )
{
this.id = id;
}

public void run()
{
String worm = null;
while (true)
{

synchronized(HungryBirds2.wormLock){
List<String> buffer = HungryBirds2.wormBuffer;
int count = buffer.size();

if(count == 0){
synchronized(HungryBirds2.birdLock){
HungryBirds2.birdLock.notify();
}
}
else{
worm = buffer.get( count-1 );
buffer.remove( count-1 );
System.out.println("Bird " + id + " ate one worm:" + worm +"!");
try
{
Thread.sleep( 1 );
}
catch (InterruptedException e)
{
e.printStackTrace();
}

}


}



}
}
}



分享到:
评论

相关推荐

    Java并发编程---synchronized关键字

    Java并发编程---synchronized关键

    Synchronized原理-思维导图

    Synchronized原理-思维导图

    java代码实例-论坛管理系统设计(源代码+论文).rar

    《Java代码实例——论坛管理系统设计》是一份集源代码与论文为一体的毕业设计作品,主要针对的是使用Java语言进行Web应用开发的实践。这份资源详细展示了如何利用Java技术栈构建一个功能完善的论坛管理系统,涵盖了...

    Java实例程序-适用于初学者

    "Java实例程序-适用于初学者"这个压缩包文件提供了丰富的学习资源,帮助初学者快速理解并实践Java编程。 1. **基础语法** - 变量:在Java中,变量是存储数据的地方,分为基本类型(如int、double)和引用类型(如...

    Java代码实例-多线程与线程安全实践-基于Http协议的断点续传.rar

    Java提供了多种机制来保证这一点,如`synchronized`关键字、`volatile`关键字、`Atomic`类以及`Lock`接口。在断点续传中,可能使用这些机制来管理共享的文件下载状态和进度。 3. **HTTP协议**:HTTP(超文本传输...

    JAVA代码实例-基于局域网的聊天室系统(源代码+论文).rar

    该压缩包文件包含了一个基于Java实现的局域网聊天室系统的源代码和相关论文,是适合于毕业设计或学习Java网络编程的实例。这个系统能够让在同一局域网内的用户进行实时交流,提供了一个简单但实用的通信平台。下面将...

    Synchronized_6_pulse_Generator.slx

    有需要2014版本之前的Synchronized 6-Pulse Generator元器件,提供slx文件下载,直接复制过去即可使用。Matlab表示:如果您的旧版型号包含 同步6脉冲发生器模块,它们将继续工作。但是,为获得最佳性能,请在新型号...

    java基础教程----精华版

    以上只是Java基础知识的一部分,实际的Java基础教程会更深入地讲解每个概念,并配有实例来帮助理解。这份"java基础教程----精华版"应该涵盖了这些主题,并且可能还有更多的实践指导和示例代码,对于学习和巩固Java...

    java面试题-java-interview-questions-master.zip

    java面试题_java-interview-questions-master.zip2、在 Java 程序中怎么保证多线程的运行安全? 出现线程安全问题的原因一般都是三个原因: 1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步...

    讲义与实例--Java

    这份“讲义与实例--Java”资料旨在提供全面的Java学习资源,帮助你深入理解这门语言。 1. **Java基础** - **数据类型**:Java有两大类数据类型,包括基本数据类型(如整型、浮点型、字符型和布尔型)和引用数据...

    线程同步(synchronized)1---马克-to-win java视频 java视频

    线程同步(synchronized)1---马克-to-win java视频 java视频

    Java synchronized使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

    Java编程71-100例 Java编程71-100例

    7. 多线程:Java提供了强大的并发支持,包括Thread类、Runnable接口、synchronized关键字、volatile变量等。通过实例,开发者可以学习如何在多线程环境下编写安全、高效的代码。 8. 输入输出流:Java的IO流系统允许...

    Java synchronized详细解读.docx

    Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...

    线程同步(synchronized)2---马克-to-win java视频

    线程同步(synchronized)2---马克-to-win java视频的介绍

    java synchronized demo

    在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本示例"java synchronized demo"旨在探讨`synchronized`关键字的用法及其作用机制。...

    synchronized用法大全实例

    在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于实现线程间的同步,以确保共享资源的安全访问。本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ##...

    Java编程21-50例 Java编程21-50例

    这个主题"Java编程21-50例"显然涵盖了从第21个到第50个Java编程实例,旨在帮助学习者通过实践加深对Java语言的理解。下面将详细解释这些实例可能涵盖的知识点,并探讨其在实际编程中的应用。 1. 类与对象:Java是一...

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    Alibaba Java Coding Guidelines-1.0.5.zip

    《阿里巴巴Java开发规约》是阿里巴巴集团内部制定的一套Java编程规范,旨在提高代码质量、降低维护难度,提升团队协作效率。这份规约不仅适用于阿里巴巴内部,也对整个开源社区产生了深远影响。"Alibaba Java Coding...

Global site tag (gtag.js) - Google Analytics