多线程执行多类型任务(线程通信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
原创粉丝点击