博客
关于我
Object Notify&Wait
阅读量:467 次
发布时间:2019-03-06

本文共 2989 字,大约阅读时间需要 9 分钟。

Java多线程生产消费示例

以下是一个使用Java多线程实现的生产者-消费者模型示例,该模型展示了如何在多线程环境中使用wait和notify方法来实现线程同步。

代码概述

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class NotifyWaitTest {
public static void main(String[] args) {
Queue
queue = new LinkedList<>();
Producer p = new Producer(queue);
Consumer c = new Consumer(queue);
p.produce();
c.consume();
}
}

生产者类(Producer)

public class Producer {
private final Queue
queue;
private static final Random r = new Random(50);
public Producer(Queue
queue) {
this.queue = queue;
}
public void produce() {
Thread pt = new Thread(new Runnable() {
@Override
public void run() {
int count = 100;
synchronized (queue) {
while (count > 0) {
int i = r.nextInt();
queue.add(i);
queue.notify();
count--;
}
}
}
});
pt.start();
}
}

消费者类(Consumer)

public class Consumer {
private final Queue
queue;
public Consumer(Queue
queue) {
this.queue = queue;
}
public void consume() {
Thread cm = new Thread(new Runnable() {
@Override
public void run() {
int count = 100;
synchronized (queue) {
try {
while (count > 0) {
if (queue.isEmpty()) {
queue.wait();
}
int i = queue.poll();
System.out.println("Consume " + i);
count--;
}
} catch (InterruptedException ie) {
System.out.println(ie.getMessage());
}
}
}
});
cm.start();
}
}

代码解释

  • 生产者(Producer)类

    • 使用一个Queue来存储生成的随机整数。
    • produce()方法中,创建一个新的线程,运行一个Runnable任务。
    • 在Runnable任务中,使用count循环从100递减到0。
    • 在每次循环中,生成一个随机整数,添加到Queue中,然后调用queue.notify(),通知等待的消费者线程。
    • 最终,生产者线程启动,开始生成和通知数据。
  • 消费者(Consumer)类

    • 使用同样的Queue来存储和消费整数。
    • consume()方法中,创建一个新的线程,运行一个Runnable任务。
    • 在Runnable任务中,使用count循环从100递减到0。
    • 在每次循环中,调用queue.poll(),取出队列中的整数并打印出来。
    • 如果队列为空,则调用queue.wait(),等待直到有数据被生产并通知。
    • 如果线程被中断,捕获异常并打印错误信息。
  • 主方法(main)

    • 创建一个新的LinkedList作为Queue。
    • 创建一个新的Producer实例,并传递Queue。
    • 创建一个新的Consumer实例,并传递相同的Queue。
    • 调用produce()consume()方法,分别启动生产者和消费者线程。
    • 最终,主线程会等待所有子线程完成,程序会退出。
  • 优点和特点

    • 线程安全:使用Queuesynchronized关键字确保了线程安全,避免了数据竞争和加速。
    • 生产通知:生产者线程在每次添加数据后都会调用queue.notify(),唤醒等待的消费者线程。
    • 消费等待:消费者线程在发现队列为空时会调用queue.wait(),直到有数据被生产并通知。
    • 随机性:生产者线程使用Random生成随机数,确保每次生成的数据是随机的。

    运行结果

    • 当程序运行时,生产者线程会不断生成随机整数并添加到Queue中,同时通知消费者线程。
    • 消费者线程会在queue.poll()方法中取出队列中的整数并打印出来,直到所有数据被消费完毕。

    这种设计模式在多线程环境中非常有用,可以应用于资源有限的环境中,确保生产者和消费者能够高效地交换数据。

    转载地址:http://finbz.baihongyu.com/

    你可能感兴趣的文章
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    查看>>
    MySQL5.6的zip包安装教程
    查看>>
    mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
    查看>>
    Webpack 基本环境搭建
    查看>>
    mysql5.7 安装版 表不能输入汉字解决方案
    查看>>
    MySQL5.7.18主从复制搭建(一主一从)
    查看>>
    MySQL5.7.19-win64安装启动
    查看>>
    mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
    查看>>
    MySQL5.7.37windows解压版的安装使用
    查看>>
    mysql5.7免费下载地址
    查看>>
    mysql5.7命令总结
    查看>>
    mysql5.7安装
    查看>>
    mysql5.7性能调优my.ini
    查看>>
    MySQL5.7新增Performance Schema表
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>