- 浏览: 68233 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Alex_Cheung:
对了,第二个没有提取码,请知悉。
一大波视频分享 -
Alex_Cheung:
谢谢分享。
一大波视频分享 -
Jiy:
很详细,谢谢分享
java并发之同步辅助类Phaser -
walle1027:
非常不错,学习了。
java并发之同步辅助类Phaser -
huangjinjin520:
somefuture 写道除了单词写错了 其他挺好的已更正
dubbo注解使用详解
生产者是指:生产数据的线程
消费者是指:使用数据的线程
生产者和消费者是不同的线程,他们处理数据的速度是不一样的,一般在二者之间还要加个“桥梁参与者”,用于缓冲二者之间处理数据的速度差。
下面用代码来说明:
//生产者
public class MakerThread extends Thread {
private final Random random;
private final Table table;
private static int id = 0;
public MakerThread(String name, Table table, long seed) {
super(name);
this.table = table;//table就是桥梁参与者
this.random = new Random(seed);
}
public void run() {
try {
while (true) {
Thread.sleep(random.nextInt(1000));//生产数据要耗费时间
//生产数据
String cake = "[ Cake No." + nextId() + " by " + getName() + " ]";
table.put(cake);//将数据存入桥梁参与者
}
} catch (InterruptedException e) {
}
}
private static synchronized int nextId() {
return id++;
}
}
再来看看消费者:
//消费者线程
public classEaterThread extends Thread {
private final Random random;
private final Table table;
public EaterThread(String name, Table table,long seed) {
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run() {
try {
while (true) {
String cake = table.take();//从桥梁参与者中取数据
Thread.sleep(random.nextInt(1000));//消费者消费数据要花时间
}
} catch (InterruptedException e) {
}
}
}
看来在这个模式里table是个很重要的角色啊,让我们来看看他吧(这里只给出个简单的):
public class Table {
private final String[] buffer;
private int tail; //下一个放put(数据)的地方
private int head; //下一个取take(数据)的地方
private int count; // buffer内的数据数量
public Table(int count) {
this.buffer = new String[count];//总量是确定的
this.head = 0;
this.tail = 0;
this.count = 0;
}
// 放置数据
public synchronized void put(String cake) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " puts " + cake);
while (count >= buffer.length) {//数据放满了就只能等待
wait();
}
buffer[tail] = cake;
tail = (tail + 1) % buffer.length;
count++;
notifyAll();//有数据了,唤醒线程去取数据
}
// 取得数据
public synchronized String take() throws InterruptedException {
while (count <= 0) {//没有数据就只能等待
wait();
}
String cake = buffer[head];
head = (head + 1) % buffer.length;
count--;
notifyAll();//有位置可以放数据了,唤醒线程,不等了
System.out.println(Thread.currentThread().getName() + " takes " + cake);
return cake;
}
}
好了我们来实验吧:
public class Main {
public static void main(String[] args) {
Table table = new Table(3); // 建立可以放置数据的桥梁参与者,3是他所能放置的最大数量的数据。
new MakerThread("MakerThread-1", table, 31415).start();//生产数据
new MakerThread("MakerThread-2", table, 92653).start();
new MakerThread("MakerThread-3", table, 58979).start();
new EaterThread("EaterThread-1", table, 32384).start();//消费数据
new EaterThread("EaterThread-2", table, 62643).start();
new EaterThread("EaterThread-3", table, 38327).start();
}
}
spring视频获取 dubbo视频获取
消费者是指:使用数据的线程
生产者和消费者是不同的线程,他们处理数据的速度是不一样的,一般在二者之间还要加个“桥梁参与者”,用于缓冲二者之间处理数据的速度差。
下面用代码来说明:
//生产者
public class MakerThread extends Thread {
private final Random random;
private final Table table;
private static int id = 0;
public MakerThread(String name, Table table, long seed) {
super(name);
this.table = table;//table就是桥梁参与者
this.random = new Random(seed);
}
public void run() {
try {
while (true) {
Thread.sleep(random.nextInt(1000));//生产数据要耗费时间
//生产数据
String cake = "[ Cake No." + nextId() + " by " + getName() + " ]";
table.put(cake);//将数据存入桥梁参与者
}
} catch (InterruptedException e) {
}
}
private static synchronized int nextId() {
return id++;
}
}
再来看看消费者:
//消费者线程
public classEaterThread extends Thread {
private final Random random;
private final Table table;
public EaterThread(String name, Table table,long seed) {
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run() {
try {
while (true) {
String cake = table.take();//从桥梁参与者中取数据
Thread.sleep(random.nextInt(1000));//消费者消费数据要花时间
}
} catch (InterruptedException e) {
}
}
}
看来在这个模式里table是个很重要的角色啊,让我们来看看他吧(这里只给出个简单的):
public class Table {
private final String[] buffer;
private int tail; //下一个放put(数据)的地方
private int head; //下一个取take(数据)的地方
private int count; // buffer内的数据数量
public Table(int count) {
this.buffer = new String[count];//总量是确定的
this.head = 0;
this.tail = 0;
this.count = 0;
}
// 放置数据
public synchronized void put(String cake) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " puts " + cake);
while (count >= buffer.length) {//数据放满了就只能等待
wait();
}
buffer[tail] = cake;
tail = (tail + 1) % buffer.length;
count++;
notifyAll();//有数据了,唤醒线程去取数据
}
// 取得数据
public synchronized String take() throws InterruptedException {
while (count <= 0) {//没有数据就只能等待
wait();
}
String cake = buffer[head];
head = (head + 1) % buffer.length;
count--;
notifyAll();//有位置可以放数据了,唤醒线程,不等了
System.out.println(Thread.currentThread().getName() + " takes " + cake);
return cake;
}
}
好了我们来实验吧:
public class Main {
public static void main(String[] args) {
Table table = new Table(3); // 建立可以放置数据的桥梁参与者,3是他所能放置的最大数量的数据。
new MakerThread("MakerThread-1", table, 31415).start();//生产数据
new MakerThread("MakerThread-2", table, 92653).start();
new MakerThread("MakerThread-3", table, 58979).start();
new EaterThread("EaterThread-1", table, 32384).start();//消费数据
new EaterThread("EaterThread-2", table, 62643).start();
new EaterThread("EaterThread-3", table, 38327).start();
}
}
spring视频获取 dubbo视频获取
发表评论
-
一大波视频分享
2018-06-09 09:36 10811.ps 链接: https://pan.baidu ... -
利用Sharding-Jdbc实现分表
2018-05-24 22:32 3696你们团队使用SpringMVC+Spr ... -
MINA原理详解
2018-05-19 13:51 14461. 通过SocketConnector同服务器端建立连接 ... -
最近有人说我欺骗消费者,今天来一波视频分享
2018-05-12 21:00 1137最近有人说我欺骗消费者,今天来一波视频分享 dubbo入门 ... -
SVN多版本库环境的搭建
2018-05-02 21:00 1097一、 1、启动SVN sudo svn ... -
前端 Java Python等资源合集大放送
2018-04-21 22:11 650如果需要学习视频,欢 ... -
Nginx会话保持之nginx-sticky-module模块
2018-04-16 20:34 1913在使用负载均衡的时候会遇到会话保持的问题,常用的方法有: 1. ... -
dubbo源码学习(四):暴露服务的过程
2018-04-14 11:38 944dubbo采用的nio异步的通信,通信协议默认为 netty, ... -
dubbo源码学习(四)初始化过程细节:解析服务
2018-04-12 20:32 573今天将真正去看dubbo内部的实现过程,看dubbo的源码前我 ... -
dubbo源码学习(二) : spring 自定义标签
2018-04-09 20:29 588做dubbo的配置时很容易发现,dubbo有一套自己的标签,提 ... -
Dubbo多注册中心和Zookeeper服务的迁移
2018-04-06 08:58 1459一、Dubbo多注册中心 1、 应用场景 例如阿里有些服务 ... -
dubbo源码学习一:基础知识及使用的相关技术
2018-04-05 20:10 643Dubbo是Alibaba开源的分布式服务框架,它最大的特点是 ... -
worker模式
2018-03-29 20:16 594今天来学学,大家也好对线程池有一个更好的理解。 public ... -
线程各种状态转移分析
2018-03-28 22:13 862线程在它的生命周期 ... -
java并发之同步辅助类Phaser
2018-03-19 21:46 1035Phaser含义: 更加复杂和强大的同步辅助类。它允许并发执 ... -
java并发之同步辅助类CyclicBarrier
2018-03-18 20:13 771CyclicBarrier含义: 栅栏允许两个或者多个线程在 ... -
java并发之同步辅助类semaphore
2018-03-14 21:24 732semaphore(seməˌfôr)含义: 信号量就是可以 ... -
Tomcat 集群 文件上传下载的共享问题 NFS配置
2018-03-12 21:50 614Tomcat 集群时上传文件时如何使得多部tomcat中的文件 ... -
it技术谱图分享
2018-03-10 22:05 4721、程序开发语言综述 2、前端工程师必备技能 3、 ... -
捋一捋dubbo配置
2018-03-07 22:37 510配置类关系(Configuration Relation) ...
相关推荐
C++ 多线程通信方式简介并结合生产者-消费者模式代码实现
基于Qt信号量实现的单生产者多消费者模式下的消息队列,可在多线程应用中对不同的消息结构体进行数据传输。
读《深入理解计算机系统》后,参照书中程序,用C代码实现生产者消费者模型,本代码可移植性强,各接口以封装好,并有注释
用多线程实现1个生产者,2个消费者模式:1、生产者生产的同时消费者不能消费2、消费者消费的同时生产者不能生产3、共享空间空的时候消费者不能继续消费4、共享空间满的时候生产者不能继续生产。
linux下C++实现生产者和消费者问题,并及时输出缓存区的状态,方便理解。代码中有详细的注释,方便阅读。
生产者消费者synchronized实现方式
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
使用多线程实现了生产者和消费者模式
C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消 费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不 用等待消费者处理,直接扔给阻塞队列,消费者不找...
使用Qt 和 C++11 的std::mutex 和 std::condition_variable 实现一个演示生产者消费者模式的Qt工程。
利用C++实现的生产消费者模式,每个生产者和消费者都在不同的线程中异步执行。
java多线程实现生产者和消费者
Linux 多线程实现生产者消费者模式.pdf
java实现生产者消费者,生产者先生产,然后通知消费者消费,然后再通知生产者生产
详细的生产者消费者的java实现过程,详细的生产者消费者的java实现过程,详细的生产者消费者的java实现过程
java 多线程 生产者消费者模式,你值得拥有
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...