文档章节

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

i
 interfaceList
发布于 2016/03/09 14:04
字数 889
阅读 36
收藏 0
点赞 1
评论 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基础thread——java5之后的多线程(浅尝辄止)

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

潇潇漓燃
06/03
0
0
你真的懂wait、notify和notifyAll吗

生产者消费者模型是我们学习多线程知识的一个经典案例,一个典型的生产者消费者模型如下: 这段代码很容易引申出来两个问题:一个是wait()方法外面为什么是while循环而不是if判断,另一个是结...

A_客
06/03
0
0
Java多线程生产者消费者实例

Java生产者消费者实例 设计:涉及到的类有食物、厨师、服务员、顾客以及测试类。厨师负责生产食物,服务员服务于顾客,顾客负责点餐以及吃饭。 技术点:Java多线程,线程安全(synchronized),...

cicadaT
2017/11/05
0
1
Java并发教程-5保护块(Guarded Blocks)

多线程之间经常需要协同工作,最常见的方式是使用Guarded Blocks,它循环检查一个条件(通常初始值为true),直到条件发生变化才跳出循环继续执行。在使用Guarded Blocks时有以下几个步骤需要...

noday
2014/04/25
0
0
JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一...

清风傲剑
2014/12/06
0
0
JAVA多线程和并发基础面试问答

原文链接 译文连接 作者:Pankaj 译者:郑旭东 校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢...

雷神雨石
2014/07/19
0
2
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
0
0
JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一...

hanzhankang
2014/01/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理...

DannyCoder
10分钟前
0
0
Firefox 61已经为Ubuntu 提供支持

最新和最好的Mozilla Firefox 61 “Quantum”网络浏览器已经为Ubuntu Linux操作系统的用户提供了支持,现在可以通过官方软件库进行更新。 Mozilla于2018年6月26日发布了Firefox 61版本,该版...

六库科技
37分钟前
0
0
Win10升级后执行系统封装(Sysprep)报错

开始封装 一年多以前开始给公司封装Win10系统,便于统一给公司电脑初始化携带各种软件的系统,致力于装完既可以开发的状态。那时候最新的版本是Win10 1703版本,自然就以他为母盘,然后结合V...

lyunweb
57分钟前
38
0
php 性能优化

#什么情况下会遇到性能问题 PHP 语法使用的不恰当

to_be_better
今天
0
0
Jenkins 构建触发器操作详解

前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 一、定时构建语法 * * * * * (五颗星,中间用空格隔...

覃光林
今天
0
0
IDEA配置技巧

超详细设置Idea类注释模板和方法注释模板 idea去掉注解param下划线 JetBrains全系列破解

AK灬
今天
0
0
rsync通过服务同步/Linux系统日志/screen工具

rsync通过服务同步 分为服务端(机器A) 和客户端(机器B) 机器A操作编辑/etc/rsyncd.conf配置文件 [root@yolks1 ~]# vim /etc/rsyncd.conf 文件中添加以下配置 port=873 ...

Hi_Yolks
今天
0
0
分发系统介绍expect脚本远程登录expect脚本远程执行命令 expect脚本传递参数

分发系统介绍 分发系统-expect讲解(也就是一个分发的脚本) 场景: 业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因为业...

lyy549745
今天
0
0
android studio 中设置创建类时的说明信息(包含 作者 ,创建时间,注释说明等)

今天简单来说一下android studio开发工具中的 一个小设置功能; 在开发过程中我们习惯给新建的类添加一些注释信息,创建日期、时间和作者等。 设置信息 File—>Settings—>Editor—>File and...

切切歆语
今天
0
0
开源监控利器Prometheus初探

前言: Kubernetes作为当下最炙手可热的容器管理平台,在给应用部署运维带来便捷的同时,也给应用及性能监控带来了新的挑战。本文给大家分享一款十分火热的开源监控工具Prometheus,让我们一...

寰宇01
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部