文档章节

java生产者与消费者和线程池

i
 interfaceList
发布于 2016/03/09 14:04
字数 889
阅读 39
收藏 0
Java线程生产者消费者模式与线程池


首先先简单地介绍一下生产者消费者模式:
例如学到的知识
Teacher(上课讲知识,造知识)=========(知识)>>Student(学生学习知识,用知识)
这就是简单的生产者消费者模式
下面来介绍一个示例来学习此概念
有一个类似Hibernate的SessionFactory工厂
MakeSessionFactory为造工厂,GetSessionFactory为使用工厂,则SessionFactory为中间类
现在实现初步的生产者消费者:version 1 code:
thread_1.SessionFactory
thread_1.GetSessionFactory
thread_1.SetSessionFactory
thread_1.SessionFactoryTest
有如下问题:
A:在每个线程中都创建了资源,每次的输出结果是null-0
已解决:在生产者消费者类中提供一个带SessionFactory的构造函数,每次传递的时候都能保持使用SessionFactory同一个对象
B:为了数据能够出现效果,加入了大条件循环,但是给出了不同的值:
同一个数据出现多次:因为cpu
配置文件名和工厂名不匹配:那是因为如果if语句刚执行好没结束就没else抢去了执行权,所以在输出时的信息不准确,例如:
in get... sessionFactory is[SessionFactory{factoryName='spring-log4j.appender.stdout.layout.ConversionPattern', configName='applicationContext.xml'}]==========
而且执行时顺序也发生了问题,如下
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097274]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097273]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097272]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097271]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097270]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097269]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097268]==========
10:15:01,828  INFO Spring4Hibernate5BaseUtils:182 - in make i = [-2146097267]==========
10:15:01,827  INFO Spring4Hibernate5BaseUtils:182 - in get... sessionFactory is[SessionFactory{factoryName='interface org.hibernate.SessionFactory', configName='hibernate.cfg.xml'}]==========
关于输出内容写到了日志,可以复制log4j.properties文件来实现,可以到日志中去查看可以发现有以上这种情况
C:现在来解决以上问题:解决方案是加锁,加锁需注意:
1.不同种类的线程都要加锁
2.不同种类的线程加的锁必须是同一把
如果不是同一把锁会发生空的情况,这也会作为一个例子
D:加好同一把锁后发现输出一大片不太好看,可以通过java等待唤醒机制来实现
Object类中提供了三个方法:
wait():等待
notify():唤醒单个线程
notifyAll():唤醒全部线程

这些方法定义在Object类中的原因是通过锁对象调用,而获取的锁可以是任意对象,所以这些方法必须定义在Object类中才能被任意类型的子类调用
finalVersion:把设置和获取的操作封装成了功能,并增加了同步,
设置只需要调用实体类方法即可


线程池:
好处:
线程池里的每一个线程结束后并不会死亡,而是回到线程池中成为空闲状态,等待下一个对象来调用
A:创建一个线程池对象,控制要创建几个线程对象。
public static ExecutorService newFixedThreadPool(int nThreads)
B:这种线程池的线程可以执行:
可以执行Runnable对象或者Callable对象代表的线程
做一个类实现Runnable接口。
C:调用如下方法即可
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)
D:我就要结束,可以吗?
可以。

Callable:带返回值的Runnable式接口,接下来做一个示例来描述我的Callable

© 著作权归作者所有

共有 人打赏支持
i
粉丝 0
博文 2
码字总数 1289
作品 0
闸北
程序员
ActiveMQ : Async error occurred: java.lang.OutO...

参考--http://activemq.apache.org/javalangoutofmemory.html 对于MQ的内容实用是可管理和可配置的。首先需要判断的是MQ的哪部分系统因内存不足而导致泄漏,是JVM,broker还是消费者、生产者...

hbdrawn
2011/06/28
0
0
聊聊并发(十)生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 在线程世界里,生产者就是生产数据的线程,消...

陶邦仁
2015/03/23
0
0
JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52714313 JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费...

Aduroidpc
2016/10/01
0
0
java基础thread——java5之后的多线程(浅尝辄止)

承上启下 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象L...

潇潇漓燃
06/03
0
0
Java中高级面试必问之多线程TOP50(含答案)

以下为大家整理了今年一线大厂面试被问频率较高的多线程面试题,由于本人的见识局限性,所以可能不是很全面,也欢迎大家在后面留言补充,谢谢。 1、什么是线程? 2、什么是线程安全和线程不安...

老道士
08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js实现产生n个随机数,并且随机数之和是固定值

function getrandom(minnum , maxnum ,total,size){ var num = total; //定义整数 var length= size; //定义多个整数的数量 var numArr = []; while(length > 1){ var rnd = Math.floor(Mat......

开源昕昕
8分钟前
0
0
精选Spring Boot三十五道必知必会知识点!

Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家。本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spring Boot、Spring MVC 和 Sp...

Java填坑之路
9分钟前
1
0
MyBatis学习笔记

相关文档 mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译 MyBatis 处理sql中的 大于,小于,大于等于,小于等于

OSC_fly
10分钟前
0
0
Gradle从不同地方复制文件到一个文件夹/打zip包

复制 task copySDK(type: Copy, dependsOn: [":fatJarTask"]) { delete JAR_NAME delete SDK_OUT_PATH delete "$ROOT_BUILD_PATH/$SDK_ZIP_NAME" into('/jniLibs') {......

SuShine
10分钟前
0
0
CentOS关闭占用端口,修改Apache默认端口,并重启Apache

查找并关闭进程 在Linux系统中可以使用lsof命令和kill命令,两个命令配合查找并关闭占用端口的进程 查看某一端口使用情况的命令: lsof -i:端口号 效果如下,PID即进程的ID 根据PID关闭进程,...

临江仙卜算子
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部