论坛首页 Java企业应用论坛

线程池和车间模式

浏览 7294 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-11-21  
  • 问题描述:

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

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

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

  • 方案二:车间模式

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

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

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




       发表时间:2010-11-22  
    没看明白这两个方案有什么区别。

    另外,可不可以这样呢:

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


    0 请登录后投票
       发表时间:2010-11-22  
    线程池???什么东西,没有听过的
    0 请登录后投票
       发表时间:2010-11-22  
    “车间模式”不是工厂模式!
    0 请登录后投票
       发表时间: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资源。其实在下载的时候消耗网络资源,实际上线程可以开得少一点,而加密数据比较耗时,可以多开一些线程。
    0 请登录后投票
       发表时间:2010-11-24  
    很抽象,没接触过这些
    0 请登录后投票
       发表时间:2010-11-24  
    很想了解车间模式.我目前是用第一种,其中每个子线程下使用了工厂模式,再开线程。
    0 请登录后投票
       发表时间:2010-11-25  
    mimang2007110 写道
    线程池???什么东西,没有听过的

    就是把一堆线程扔到一个数组里,有一个线程专门维护这个数组里的线程。就叫线程池。
    0 请登录后投票
       发表时间:2011-03-31  
    两种方案实现的功能是一样的,我感觉第一种方案适合那种小的程序,第二种方案适合复杂的程序
    0 请登录后投票
    论坛首页 Java企业应用版

    跳转论坛:
    Global site tag (gtag.js) - Google Analytics