生产者和消费者模型:
package thread;
class Producer implements Runnable {
public Producer(Q q) {
this.q = q;
}
Q q;
public void run() {
int i = 0;
while (true) {
/*
synchronized (q) {// 当前线程得到对象q的lock旗标
if (q.bFull) {
try {
q.wait();// 此时当前线程被放置在对象q的等待池中,当前线程释放q的锁旗标
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (i == 0) {
q.name = "zhangsan";
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
q.sex = "male";
} else {
q.name = "lisi";
q.sex = "female";
}
q.bFull = true;
q.notify();// 当另外的线程执行了对象o的notify()方法后,当前线程可能会被从q的等待
// 线程池中释放出来,并且移动到等待线程对象q的锁旗标的线程池中,当当前 //线程得到的锁旗标时就会执行下去
}*/
if (i == 0) {
q.put("zhangsan", "male");
} else {
q.put("lisi", "female");
}
i = (i + 1) % 2;
}
}
}
class Consumer implements Runnable {
public Consumer(Q q) {
this.q = q;
}
Q q;
@Override
public void run() {
while (true) {
/*
* synchronized (q) {
* if (!q.bFull) {
try {
q.wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
* }
* if (q.name != "") {
* System.out.print(q.name); q.name = "";
* }
* if (q.sex != "") {
* System.out.println(":" + q.sex); q.sex = "";
* }
* q.bFull = false;
* q.notify(); }
*/
q.get();
}
}
}
class Q {
private String name = "unknown";
private String sex = "unknown";
private boolean bFull = false;
public synchronized void put(String name, String sex) {
if (bFull) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.name = name;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.sex = sex;
bFull = true;
notify();
}
public synchronized void get() {
if (!bFull) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(name);
System.out.println(":" + sex);
bFull = false;
notify();
}
}
调用入口:
public class ThreadCommunation {
public static void main(String[] args) {
Q q = new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start();
}
}
分享到:
相关推荐
在本项目"Java练手_电子时钟"中,我们主要关注的是如何使用Java编程语言来实现一个实时更新的数字时钟。这个练习涉及到多个Java技术领域,包括Java线程、AWT(Abstract Window Toolkit)绘图库以及Swing组件库。下面...
在Java的编程实践中,"练手"是非常重要的一环。通过不断的练习,可以深入理解Java的基础语法、类与对象、封装、继承、多态等核心概念。下面我们将深入探讨这些关键知识点: 1. **基础语法**:Java的基础语法包括...
### Java新手练手实验指导知识点解析 #### 一、熟悉并配置 Java 的运行环境 **实验目的** 1. **掌握安装 J2SE 开发工具的方法:**初学者首先需要了解如何下载并安装 Java 开发工具包 (JDK),通常推荐官方渠道获取...
这个"java相关的练手项目"压缩包很可能是为了帮助Java初学者或开发者提升技能,通过实践来深入理解Java语言的核心概念和技术。下面将详细讨论Java编程中的一些关键知识点,这些内容可能与压缩包中的项目相关。 1. *...
资料中的"练手小项目源码"是实践这些概念的重要部分。 1. **Java基础知识**:学习Java首先需要掌握基础语法,包括变量、数据类型、运算符、控制结构(如if语句和循环)、方法定义以及类和对象的概念。了解如何通过...
Java入门级练手小游戏源码合集是一个专为初学者设计的资源包,它包含了多个用Java编程语言编写的简单游戏项目。这个合集对于那些正在学习Java编程并希望实践编程技能的人来说,是一个非常有价值的资源。通过分析这些...
【Java练手小项目——多线程聊天室】 在Java编程世界中,多线程是不可或缺的一部分,尤其在开发实时性、交互性强的应用时,如我们的主题“多线程聊天室”。这个实战项目旨在帮助开发者深入理解Java多线程的概念,并...
在这个"Java Swing小游戏,纯练手.zip"压缩包中,很显然包含了一个用Java Swing开发的小游戏源代码,适合初学者进行实践和提升技能。 这个项目可能包含以下几个关键知识点: 1. **Java Swing基础知识**:Java ...
ThreadGroup 类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。为什么不推荐使用?因为使用有很多的安全隐患吧,没有具体追究,...
"javaSE练手小项目"这个压缩包文件为你提供了宝贵的动手实践机会,旨在帮助你巩固基础知识,为后续的Java Web开发打下坚实基础。以下将详细解释这些小项目可能涵盖的知识点,并提供相关扩展,帮助你深入理解和应用...
Java SE学习完成后,自己练手项目十一 这个项目里面多出了:任务栏图标功能实现,和浮动图标的实现(SystemTray 、JWindow) 巩固了线程、序列化等概念,再次使用树形、表格 留心主界面的关闭按钮,我改成隐藏...
Java的Thread类或者java.util.Timer类可以用来实现游戏的主循环,保证游戏以一定的帧率平稳运行。同时,定时器可以用来控制游戏的某些特定行为,比如定时生成敌人或触发特定事件。 游戏的状态管理也很重要。在Java...
5. **多线程**:Java提供了丰富的多线程支持,如Thread类、Runnable接口、synchronized关键字等。通过解决多线程问题,你将学习到如何在并发环境下控制程序执行顺序和共享资源。 6. **I/O流**:Java的IO流用于读写...
本篇文章将详细讲解Java和JavaSE的基础知识点,并结合提供的"Java JavaSE 必练基础案例",帮助你巩固和深化理解。 首先,Java是一种面向对象的编程语言,它的设计目标是“一次编写,到处运行”。这意味着,通过Java...
对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
《用Java编写的中国象棋》是一款基于Java编程语言实现的桌面游戏,它将传统的中国象棋规则与现代计算机技术相结合,为玩家提供了一个在数字平台上体验象棋乐趣的平台。下面将详细介绍这款游戏的实现原理、核心功能...
【标题】"FileManager练手,功能不完善"指的是一个由个人开发者编写的Android文件管理器应用,它可能作为初学者的实践项目或是用于学习和研究。这个应用在功能上可能存在一些缺失,因此用户在下载和使用时需要有所...