多线程执行多任务(线程通信):生产者消费者模型(一)
2014-10-22 10:26
309 查看
这里使用整数自增和自减来模拟生产和消费。先来简单的,每个任务只有一个线程执行。
先定义一个工作台Workbench,用于生产和消费:
测试:
运行结果遵循以下规范:
1.最小值为0,最大值为100。
2.输出0的一定是消费者,输出100的一定是生产者。
3.永远不会出现两个连续的结果相等。
4.生产者的输出结果一定是在上一次的输出结果上加1;消费者的输出结果一定是在上一次的输出结果上减1。
通信锁具有互斥作用,也就是说当生产者正在生产时,消费者不能消费;当消费者正在消费时,生产者不能生产。通信锁会让相互关联的不同任务不会同时执行。
先定义一个工作台Workbench,用于生产和消费:
package com.xs.thread; /** * 工作台 * * @author Administrator * */ public class Workbench { private int number = 0; private int maxNumber = 1;// 最大的产品存储量 private Object talkLocker = new Object();// 定义通信锁 public Workbench() { } public Workbench(int maxNumber) { this.maxNumber = maxNumber; } /** * 生产 * * @return */ public void produce() { 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 (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 ThreadTalkTest { /** * @param args */ public static void main(String[] args) { final Workbench workbench = new Workbench(100); // 生产任务 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..."); Thread producer = new Thread(produceTask); producer.setName("producer"); Thread consumer = new Thread(consumeTask); consumer.setName("consumer"); producer.start(); consumer.start(); } }
运行结果遵循以下规范:
1.最小值为0,最大值为100。
2.输出0的一定是消费者,输出100的一定是生产者。
3.永远不会出现两个连续的结果相等。
4.生产者的输出结果一定是在上一次的输出结果上加1;消费者的输出结果一定是在上一次的输出结果上减1。
通信锁具有互斥作用,也就是说当生产者正在生产时,消费者不能消费;当消费者正在消费时,生产者不能生产。通信锁会让相互关联的不同任务不会同时执行。
相关文章推荐
- 多线程执行多任务(线程通信):生产者消费者模型(二)
- python多线程(3)---生产者与消费者(线程通信)和Queue模块
- java多线程-线程间通信_生产者消费者
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- Java多线程并发执行-生产者消费者模型
- JAVA 线程通信以及多个生产者消费者模型
- java多线程线程通信——生产者和消费者
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- Java线程间通信问题分析(生产者消费者模型)
- java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
- Java基础学习__多线程(线程间通信--生产者消费者JDK5.0升级版)
- 从Java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换
- Java 多线程(二)线程间的通信应用--生产者消费者(未完)
- 黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)
- java多线程:线程间的通信-生产者和消费者(三)
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- 第23章 java线程通信——生产者/消费者模型案例
- 黑马程序员--JAVA基础复习之多线程(三)线程间通信 生产者消费者