我理解的线程池,就是一个公共的线程池资源池,那既然是公共的,是不是必须要作为静态变量?因为我看见网上,有很多代码都是在实例方法里创建的线程池,之后,在shutdown,
那这样不就体现不出线程池的优势了吗?

解决方案 »

  1.   

    全局的静态线程池对使用者来说局限性太大了,有时候我们可能希望精细控制,哪些任务需要放到不同的线程池里,从而在局部分配计算资源。如果只有一个线程池,那么就无法精细分配不同计算任务的计算资源了。
    比如支援前端访问的任务,我们一般希望要数量要大,但单个任务占用的计算资源并不高;而部分后台统计任务,需要的数量不高,但由于是密集计算,所以线程数要少,避免过分占用服务器CPU。
      

  2.   

    嗯,这个可以理解,相当于不同类型的任务,使用不同类型的线程池,
    但是我不能理解的是,为什么在局部分配资源后,直接把线程池shutdown了,下次再有任务的话,
    还是要重新创建线程池,这样做的考虑是什么?谢谢
      

  3.   

    你确定没看错?
    除非这个代码仅仅是个示例,这样怎么写都没啥毛病所以你是支持,线程池作为静态变量的?
    我仅仅是表示在方法里创建线程池毫无意义,但变量也分为静态变量,成员变量,局部变量,前两者都没有问题的,但局部变量这种仅仅是写demo才有意义
      

  4.   

    你确定没看错?
    除非这个代码仅仅是个示例,这样怎么写都没啥毛病所以你是支持,线程池作为静态变量的?
    我仅仅是表示在方法里创建线程池毫无意义,但变量也分为静态变量,成员变量,局部变量,前两者都没有问题的,但局部变量这种仅仅是写demo才有意义
    嗯,我的理解是,把线程池作为静态变量,才能显示出“池”的优势,
    如果作为成员变量,GC后,不就回收了么,这样的意思好像不太大,请教您的看法。
      

  5.   

    你确定没看错?
    除非这个代码仅仅是个示例,这样怎么写都没啥毛病所以你是支持,线程池作为静态变量的?
    我仅仅是表示在方法里创建线程池毫无意义,但变量也分为静态变量,成员变量,局部变量,前两者都没有问题的,但局部变量这种仅仅是写demo才有意义
    嗯,我的理解是,把线程池作为静态变量,才能显示出“池”的优势,
    如果作为成员变量,GC后,不就回收了么,这样的意思好像不太大,请教您的看法。

    成员变量他所属的对象也能是静态变量的
      

  6.   

    个人感觉应该是申明为静态成员变量较好,这样同一个服务的多个线程就能共享该线程池,如果是成员变量和局部变量的话每个线程里都会自己去创建线程池去销毁。成员变量和局部变量的不同之处在于成员变量存在堆里,局部变量的线程池在栈里,栈的操作更快生命周期更短(方法执行期间)但是会占用栈有限的空间,jdk 1.8以后每个线程默认分配1M之前是(128k)。如果是成员变量则空间由jvm管理释放,相应的生命周期也较长,但对于堆来说空间就显得不那么紧要。综上最终采取什么方式要看你对于该服务的理解,找出最合适的方式。
      

  7.   


    class Test{
    public static final Executor exec = Executor.newCachedThreadPool();
    }这样使用线程池有没有问题?exec会不会被shutdown?
      

  8.   


    class Test{
    public static final Executor exec = Executor.newCachedThreadPool();
    }这样使用线程池有没有问题?exec会不会被shutdown?class Test{
    public static final Executor exec = Executor.newCachedThreadPool();
    }这样使用线程池有没有问题?exec会不会被shutdown?
    你不手动shutdown自然不会有问题,这就相当于从jvm启动后就维护了一个线程池,这个线程池不会被关闭,可以被多个线程重复利用,如果在代码里shutdown那么其他的线程任务就会被拒绝。
      

  9.   


    class Test{
    public static final Executor exec = Executor.newCachedThreadPool();
    }这样使用线程池有没有问题?exec会不会被shutdown?class Test{
    public static final Executor exec = Executor.newCachedThreadPool();
    }这样使用线程池有没有问题?exec会不会被shutdown?
    你不手动shutdown自然不会有问题,这就相当于从jvm启动后就维护了一个线程池,这个线程池不会被关闭,可以被多个线程重复利用,如果在代码里shutdown那么其他的线程任务就会被拒绝。请问线程池是线程安全的吗? 应该怎样正确的使用线程池,可不可以举个例子