`
cjnetwork
  • 浏览: 180013 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

线程池和车间模式

阅读更多
  • 问题描述:

  • 一个对象,需要多个步骤处理,之所以要分开处理,是因为:
                                         1、这样的对象很多
                                         2、每个步骤耗时不一样,有的步骤可能是IO操作

  • 解决方案
  • 方案一:线程池处理

  • 使用JDK自带的ExecutorService pool = Executors.newFixedThreadPool(10)方式很容易实现线程池的管理

  • 方案二:车间模式

  • 在车间中,车间只负责对对象进行处理,车间甚至不需要知道怎么获取需要处理的对象,也不需要知道处理完成对象之后交到何处,因为这个可以由别的资源来处理这个对象的传输、调度问题。

  • 区别:两种方式的区别在于,“车间”线程在程序运行期间,是不需要销毁的,车间线程在有需要处理的对象的时候,依照规则处理对象,在没有需处理的对象的时候,“车间”线程空闲;而线程池处理方式中,虽然线程池里的线程也是不需要销毁的,但是需要被执行的Task是需要创建的。

  • 注:图示中所用标记不一定很准确,只是想描述一下问题




    分享到:
    评论
    9 楼 bob_abc_keeny 2011-03-31  
    两种方案实现的功能是一样的,我感觉第一种方案适合那种小的程序,第二种方案适合复杂的程序
    8 楼 terrylrvin 2010-11-25  
    mimang2007110 写道
    线程池???什么东西,没有听过的

    就是把一堆线程扔到一个数组里,有一个线程专门维护这个数组里的线程。就叫线程池。
    7 楼 jzl_root 2010-11-24  
    很想了解车间模式.我目前是用第一种,其中每个子线程下使用了工厂模式,再开线程。
    6 楼 angel243fly 2010-11-24  
    很抽象,没接触过这些
    5 楼 xjwm 2010-11-24  
    SEDA.
    4 楼 cjnetwork 2010-11-24  
    hardPass 写道
    没看明白这两个方案有什么区别。

    另外,可不可以这样呢:

    开始 -> 队列 -> 线程池 -> 线程1 步骤1、2、3...
                           -> 线程2 步骤1、2、3...
                           -> 线程3 步骤1、2、3...
                           -> 线程4 步骤1、2、3...





    线程池模式中,任务的生命周期短,创建——>加入线程池,等待执行——>执行任务——>结束
    而车间模式中,一个车间线程从程序开始的时候创建,知道程序结束的时候销毁,中途是不需要销毁的,一直在处理待加工数据,没有数据的时候则空闲

    一个比喻:将一批带泥土的萝卜,制造成餐桌上菜肴的装饰品
    加工过程:清洗、雕刻、送货

    线程池模式:你找来甲乙丙三人(三个线程池),你将萝卜交给甲,并告诉甲“你将处理好的萝卜清洗好了交给乙”,然后你告诉乙“你将萝卜雕刻好了交给丙”,然后你又告诉丙“你将萝卜送到餐馆”。但是甲乙丙都不会自己干活,他们分别掌握了清洗设备、雕刻设备、运输设备这些资源,然后对每个萝卜的处理,他们都是另外从人才市场找一个人,来处理,处理完成了之后,招聘会来的那个人就解雇。
    车间模式:你将萝卜分成几份,分别交给不同的清洗公司(车间线程一)清洗,然后你从清洗公司取回清洗好的萝卜,然后交给不同的雕刻公司(车间线程二),然后你从雕刻公司取回雕刻好的萝卜,找了不同的运输公司(车间线程三)运输到目标餐馆。这个过程,你不是等所有萝卜都清洗好了再处理,如果精力允许,你是不断在做这个事情,你取清洗公司,取回部分清洗好的萝卜,将这些萝卜送到雕刻公司,顺便从雕刻公司取回已经雕刻好的萝卜,然后将雕刻好的萝卜送到运输公司,让运输公司送到餐馆。


    考虑这样一种情况,就比较麻烦,情况如下:
          步骤1:从互联网上下载数据
          步骤2:分析数据,进行逻辑处理,例如对每一条数据加密100万次
          步骤3: 将分析结果存入数据库

          考虑因素:从互联网上下载数据是跟带宽有关的,数据加密100万次是跟CPU资源有关的
          从互联网上下载是比较慢的,不需要消耗太多的CPU资源;而进行100万次的数据加密,是非常消耗CPU资源的,你的方式会使得各个线程在一开始的时候都去等待网络资源,然后又都等待CPU资源。其实在下载的时候消耗网络资源,实际上线程可以开得少一点,而加密数据比较耗时,可以多开一些线程。
    3 楼 zhonggeneral 2010-11-22  
    “车间模式”不是工厂模式!
    2 楼 mimang2007110 2010-11-22  
    线程池???什么东西,没有听过的
    1 楼 hardPass 2010-11-22  
    没看明白这两个方案有什么区别。

    另外,可不可以这样呢:

    开始 -> 队列 -> 线程池 -> 线程1 步骤1、2、3...
                           -> 线程2 步骤1、2、3...
                           -> 线程3 步骤1、2、3...
                           -> 线程4 步骤1、2、3...


    相关推荐

      线程池 + 工厂模式 + 工厂方法 + 单件模式

      线程池、工厂模式、工厂方法和单件模式是软件设计中常见的模式,它们在构建高效、可扩展的系统中发挥着关键作用。此外,内存池的概念也与资源管理紧密相关,尤其在处理大量对象创建时能提升性能。下面将分别详细介绍...

      Android线程池+单例模式+webService

      本项目涉及了三个核心概念:线程池、单例模式和WebService,这些都是Android应用开发中的重要知识点。 首先,让我们来深入理解线程池。线程池是一种多线程处理形式,预先创建了多个线程,当需要执行任务时,直接从...

      Java线程池及观察者模式解决多线程意外死亡重启问题

      Java线程池是Java并发编程中的重要组成部分,它...总之,通过Java线程池和观察者模式的结合,我们可以构建一个健壮的多线程系统,即使在部分线程意外终止的情况下,也能及时发现并采取措施恢复,确保系统的稳定运行。

      阻塞线程池 阻塞线程池 阻塞线程池

      阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池...

      Python 程序语言设计模式思路-并发模式:线程池模式:管理线程池,优化线程创建和销毁

      线程池模式(Thread Pool Pattern)是一种优化线程管理的设计模式,它通过创建一个线程池来管理和复用线程,从而避免频繁的线程创建和销毁,提高系统性能。线程池模式适用于需要频繁执行大量短生命周期任务的场景,...

      多线程写法(精易模块线程池和鱼刺模块线程池)

      本篇文章将重点探讨两种线程池实现:精易模块线程池和鱼刺模块线程池,并通过源码分析来展示它们的特点和用法。 首先,精易模块(SanYe Module)是由中国程序员SanYe开发的一系列开源模块,其中包含了线程池的实现...

      java线程池和反射机制例子

      线程池和反射机制的结合可以带来强大的功能,例如,我们可以动态加载不同的类实现某个接口,并在运行时通过线程池并行执行这些接口的方法。这在处理插件系统、异步任务调度或动态服务加载等场景中非常有用。 总结来...

      并发-线程池和阻塞队列

      在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...

      c++多线程,多进程通讯模型,死锁,线程池,单例模式的实现,共享指针,atomic等等

      c++多线程,多进程通讯模型,死锁,线程池,单例模式的实现,共享指针,atomic等等

      并发-线程池和阻塞队列.pdf

      线程池和阻塞队列是实现并发的关键组件之一。本文将详细介绍线程池原理、使用场景及注意事项,以及阻塞队列的相关知识。 首先,线程池是一种基于池化思想管理线程的技术,它可以重用一组线程执行多个任务。线程池的...

      cpp-利用C编写的HTTP服务器使用线程池Reactor模式

      通过阅读源代码和文档,你可以了解线程池和Reactor模式在实际项目中的具体应用,这对于提升你的网络编程技能非常有帮助。如果你计划进一步扩展这个服务器,可以考虑增加对HTTPS的支持,优化线程池的调度策略,或者...

      线程池  

      线程池是一种多线程处理形式,通过预先创建一定数量的线程并管理它们,以提高系统的效率和响应性。在计算机科学中,特别是在软件开发领域,线程池是操作系统或者编程语言中的一种资源管理技术。它允许程序预先启动一...

      线程池线程池线程池线程池

      线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池...

      仿ACE线程池机制实现的线程池类

      线程池是一种优化资源管理的机制,通过预先创建并维护一组可重用的线程,避免频繁地创建和销毁线程带来的性能开销。在Java、C++等编程语言中,线程池广泛应用于并发处理,提高系统效率,降低系统的资源消耗。本项目...

      两种线程池的实现和性能评价

      通过对HH线程池和LF线程池的实现原理及性能特点进行深入分析,并结合实验数据,可以得出以下结论: - 在处理大量短时间任务时,HH线程池能够通过异步机制提高系统性能; - 对于长时间运行的任务或高并发场景,LF...

      C++线程池,带PPT 线程池

      这种设计模式可以避免频繁地创建和销毁线程带来的性能损失,同时也能更好地控制系统的并发程度,防止过多的线程消耗资源导致系统不稳定。 C++11及后续标准库(C++14、C++17、C++20)引入了`std::thread`库,提供了...

      简单线程池与线程池检查的实现

      标题 "简单线程池与线程池检查的实现" 涉及到的是计算机编程中的多线程管理和优化,特别是线程池的概念及其检查机制。线程池是一种多线程处理形式,预先创建一定数量的线程,放入池中,当有任务需要执行时,直接从池...

      java线程池完整代码

      Java 线程池是 Java 语言中的一个重要概念,它允许开发者创建和管理多个线程,以提高程序的并发性和性能。下面是对给定文件的解析,包括 title、description、标签和部分内容的解析。 标题解析 标题 "Java 线程池...

      线程池

      线程池的使用可以有效地管理和控制并发执行的任务,减少线程创建和销毁的开销,提高系统资源利用率。 在描述中提到的博文链接虽然没有给出具体内容,但通常会包含线程池的工作原理、创建方式以及最佳实践等内容。...

      一个线程池封装类及例子程序

      在"A programming model to use a thread pool.txt"文档中,可能会详细讲解线程池的工作模式和编程模型,包括如何提交任务到线程池,如何定制线程池的行为,以及如何监控和调整线程池的参数。 "threadpool.zip"和...

    Global site tag (gtag.js) - Google Analytics