多线程执行多类型任务(线程通信wait/notify(notifyAll)):生产者消费者模型(二)
来源:互联网 发布:mac运行32位软件 编辑:程序博客网 时间:2024/05/31 19:54
每个任务有多个线程执行。
工作台类HigherWorkbench:
package com.xs.thread;/** * 工作台 * * @author Administrator * */public class HigherWorkbench {private int number = 0;private int maxNumber = 1;// 最大的产品存储量private Object talkLocker = new Object();// 定义通信锁private Object produceTaskLocker = new Object();// 定义生产任务锁private Object consumeTaskLocker = new Object();// 定义消费任务锁public HigherWorkbench() {}public HigherWorkbench(int maxNumber) {this.maxNumber = maxNumber;}/** * 生产 * * @return */public void produce() {synchronized (produceTaskLocker) {synchronized (talkLocker) {if (number > maxNumber - 1) {try {talkLocker.wait();} catch (InterruptedException e) {e.printStackTrace();}}int temp = ++number;// 打印生产后的数量System.out.println(Thread.currentThread().getName() + " --> "+ temp);talkLocker.notify();}}}/** * 消费 * * @return */public void consume() {synchronized (consumeTaskLocker) {synchronized (talkLocker) {if (number < 1) {try {talkLocker.wait();} catch (InterruptedException e) {e.printStackTrace();}}int temp = --number;// 打印消费后的数量System.out.println(Thread.currentThread().getName() + " --> "+ temp);talkLocker.notify();}}}}测试类:
package com.xs.thread;public class HigherThreadTalkTest {/** * @param args */public static void main(String[] args) {final int maxNumber = 1000;final int producers = 100;final int consumers = 100;final HigherWorkbench workbench = new HigherWorkbench(maxNumber);Thread[] producerThreads = new Thread[producers];Thread[] consumerThreads = new Thread[consumers];// 生产任务Runnable produceTask = new Runnable() {public void run() {while (true) {workbench.produce();}}};// 消费任务Runnable consumeTask = new Runnable() {public void run() {while (true) {workbench.consume();}}};System.out.println("start...");// 创建线程for (int i = 0; i < producerThreads.length; i++) {Thread thread = new Thread(produceTask);thread.setName("producer" + i);producerThreads[i] = thread;}for (int i = 0; i < consumerThreads.length; i++) {Thread thread = new Thread(consumeTask);thread.setName("consumer" + i);consumerThreads[i] = thread;}// 启动线程for (int i = 0; i < producerThreads.length; i++) {producerThreads[i].start();}for (int i = 0; i < consumerThreads.length; i++) {consumerThreads[i].start();}}}
任务锁用于锁定单个任务,而通信锁表述的是任务之间的协作关系。通常有多少个任务需要执行,就可以定义多少把任务锁;有多少个任务之间的协作关系,就可以定义多少把通信锁。
以上例子中,有两个任务,即生产和消费,所以定义了两个任务锁;生产和消费之间存在协作关系,所以定义了一个通信锁。
0 0
- 多线程执行多类型任务(线程通信wait/notify(notifyAll)):生产者消费者模型(二)
- 多线程执行多类型任务(线程通信wait/notify(notifyAll)):生产者消费者模型(一)
- 多线程五,线程间通信3,wait、notify,notifyAll方法,生产者和消费者问题(14,毕向东老师)
- 多线程通信( wait(),notify(),notifyAll() )
- 线程通信(wait()、notify()、notifyAll() 方法)
- java 多线程之 wait(),notify(),notifyAll()以及经典的生产者消费者模型
- java 多线程之 wait(),notify(),notifyAll()以及经典的生产者消费者模型
- 生产者 消费者 (wait notify)
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
- 【Java】线程wait() notify()通信 实现生产者 消费者问题
- 线程通信(生产者消费者问题)、wait()与notify()方法详解
- Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”
- 多线程五,线程间通信,wait、notify,notifyAll方法(14,毕向东老师)
- 多线程五,线程间通信2,wait、notify,notifyAll方法(14,毕向东老师)
- Java多线程笔记三(线程通信wait/notify/notifyAll/sleep/yield/join)
- 多线程生产者消费者模式(wait()和notify())
- 多线程--生产者消费者问题(wait和notify方法)
- Java 多线程实现生产者消费者问题(wait/notify)
- HDU 4049
- 定时发邮件
- EF CodeFirst 级联删除
- .net简单的缓存类
- 在vs2010下编译boost
- 多线程执行多类型任务(线程通信wait/notify(notifyAll)):生产者消费者模型(二)
- spring中使用logback日志组件替换log4j
- Android中判断输入的字符串是否为数字,可以解决如输入为点出现的问题
- Android最新组件RecyclerView,替代ListView
- VS2010与mysql
- STL源码之实现一个简易的Vector容器
- Dongle烧写模块重构(四)--用工厂模式将方案商从功能代码中抽离
- servlet 学习二
- OllyDbg破解系列学习笔记(四)