多线程实验_多生产者多消费者操作一个栈list
来源:互联网 发布:php 分销系统源码 pc 编辑:程序博客网 时间:2024/05/16 05:02
//只是很简单的实现了数据集,数据集的操作服务类,多线程模拟多生产者和多消费者。最后一个测试类。
数据集类
package entity;import java.util.ArrayList;import java.util.List;/** * synchronized同步对象是MyStack实例对象 * list只是一个元素 * @author cindy * */public class MyStack { private List list = new ArrayList<String>(); /** * 生产栈元素 */ synchronized public void push() { try { while (list.size() == 1) { System.out.println("push操作阻塞" + ",线程是" + Thread.currentThread().getName()); this.wait(); } list.add("hello vincent" + Math.random()); this.notifyAll(); System.out.println(Thread.currentThread().getName() + "进程进行了一次push操作" + "push=" + list.size()); } catch (Exception e) { // TODO: handle exception } } /** * 消耗栈元素 * * @return */ synchronized public String pop() { String result = ""; try { while (list.size() == 0) { System.out.println("pop操作阻塞:" + Thread.currentThread().getName() + "线程呈wait状态"); this.wait(); } result = list.get(0) + ""; list.remove(0); this.notifyAll(); System.out.println("pop=" + list.size() + "\t" + Thread.currentThread().getName()); } catch (Exception e) { // TODO: handle exception } return result; } public MyStack() { // TODO Auto-generated constructor stub }}
生产者服务类
package service;import entity.MyStack;public class P { private MyStack myStack; public P(MyStack myStack) { // TODO Auto-generated constructor stub this.myStack = myStack; } public void pushService() { myStack.push(); }}
消费者服务类
package service;import entity.MyStack;public class C { private MyStack myStack; public C(MyStack myStack) { // TODO Auto-generated constructor stub this.myStack = myStack; } public void popService() { System.out.println("pop=" + myStack.pop()); }}
生产者线程类
package extthread;import service.P;public class P_thread extends Thread { private P p; public P_thread(P p) { this.p = p; } @Override public void run() { // TODO Auto-generated method stub super.run(); while (true) { p.pushService(); } }}
消费者线程类
package extthread;import service.C;public class C_thread extends Thread { private C c; public C_thread(C c) { this.c = c; } @Override public void run() { // TODO Auto-generated method stub super.run(); while (true) { c.popService(); } }}
测试类
package test.run;import entity.MyStack;import extthread.C_thread;import extthread.P_thread;import service.C;import service.P;public class Run { public Run() { // TODO Auto-generated constructor stub } public static void main(String[] args) { MyStack myStack = new MyStack(); C c1 = new C(myStack); C c2 = new C(myStack); C c3 = new C(myStack); P p1 = new P(myStack); P p2 = new P(myStack); P p3 = new P(myStack); P_thread p_thread1 = new P_thread(p1); P_thread p_thread2 = new P_thread(p2); P_thread p_thread3 = new P_thread(p3); C_thread c_thread1 = new C_thread(c1); C_thread c_thread2 = new C_thread(c2); C_thread c_thread3 = new C_thread(c3); p_thread1.start(); p_thread2.start(); p_thread3.start(); c_thread1.start(); c_thread2.start(); c_thread3.start(); }}
测试结果图
从这幅图可以看到多个生产者线程往list列表生成数据,消费者消费生产者生成的数据。同时可以看到list长度一直保持在1。当一个生产者线程产生了一个数据后,其他生产者线程将阻塞,等待消费者线程消费完后,在由其中一个生产者阻塞线程生成下一个数据。
0 0
- 多线程实验_多生产者多消费者操作一个栈list
- 多线程_生产者消费者
- 【多线程_生产者消费者队列】
- 多线程_生产者与消费者
- java多线程 一个生产者和多个消费者
- 06_多线程_生产者消费者
- java-多线程 多对多 生产者消费者
- C++ 单生产者多消费者多线程示例
- 多线程问题之多生产者/多消费者
- 多线程_生产者消费者问题描述图
- 多线程_生产者消费者问题代码1
- 一个生产者多个消费者问题
- Java基础_线程_多线程_生产者消费者问题
- 【多线程】_线程操作案例——生产者和消费者笔记
- 【多线程】_线程操作案例——生产者和消费者笔记
- 多线程操作案例---生产者与消费者
- 多线程生产者消费者Demo2_ Lock操作
- 生产者和消费者多线程共享一个仓库(多竞争一)
- 操作系统中常用到的进程调度算法
- String和StringBuffer、ArrayList和LinkedList、HashMap和HashTable的特点及区别。
- 享元模式
- 第一篇文章
- 环境企业表单权限分配填报数据系统设计与实现
- 多线程实验_多生产者多消费者操作一个栈list
- Google I/0 2016 Highlights
- MySQL学习19:运算符与函数之信息函数、聚合函数、加密函数
- 基于PCA的人脸识别_Matlab实现(个人研读之后的一些总结)
- python之列表、元祖、集合、字典基础篇
- java web(SSM框架)实现博客的上一篇、下一篇功能
- 模拟实现strstr
- 4、struts2_标签库
- C++第二次实验