`
softstone
  • 浏览: 461109 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java多线程开发八——线程池1

阅读更多
 
线程池
JDK1.5以后提供了一个线程池执行器,可以使用线程池执行一组任务。先看一下示例,代码来自于JDK文档。
 
class NetworkService {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;
 
    public NetworkService(int port, int poolSize) throws IOException {
      serverSocket = new ServerSocket(port);
      //创建线程池
      pool = Executors.newFixedThreadPool(poolSize);
    }
    public void serve() {
      try {
        for (;;) {
         //使用线程池执行Runnable任务
          pool.execute(new Handler(serverSocket.accept()));
        }
      } catch (IOException ex) {
        pool.shutdown();
      }
    }
 }
 
 /*
 需要执行的任务。     
 */
 class Handler implements Runnable {
    private final Socket socket;
    Handler(Socket socket) { this.socket = socket; }
    public void run() {
      // read and service request
    }
 }
 
示例代码使用工厂Executors创建了一个固定大小的线程池,并且使用线程池来执行Runnable任务。示范了使用线程池的基本的步骤:创建线程池,使用线程池执行任务。
关于线程池的说明
1、 池的大小。池有一个CoreSize和MaximumSize,当池中线程小于CoreSize时,使用execute执行任务,线程池会创建一个线程来执行任务,即使池中有空闲的线程。如果线程池中线程数目在CoreSize和MaximumSize之间,如果任务队列满了,不能缓存任务,线程池会创建新的线程来执行新来的任务。CoreSize和MaximumSize一样时,就创建了一个固定大小的线程池。MaximumSize甚至可以设置成Integer.MAX_VALUE,每一个并发任务都不会等待。可以使用setCorePoolSize(int)setMaximumPoolSize(int)来设置池的大小。
2、 线程的激活时间。对于池中超过CoreSize的线程,如果空闲了一段时间,线程池会自动终止线程以减少资源消耗。这个时间通过setKeepAliveTime(long, java.util.concurrent.TimeUnit)来设置。.
3、线程的创建。默认使用Executors.defaultThreadFactory()来创建线程,这些线程属于一个组,有普通的优先级,非daemon状态。如果有不同的需求,可以自己实现一个ThreadFactory,提供给Executors创建线程池。譬如使用以下语句创建线程池,                        newFixedThreadPool(int nThreads,  ThreadFactory threadFactory)
4、 任务队列的大小。任意的BlockingQueue都可以作为任务队列。任务队列和线程池的交互:
                        i.              线程数小于CoreSize,总是新建线程,不管Queue如何
                      ii.              如果线程数目等于或大于CoreSize,Queue优先缓存任务。
                    iii.              如果线程数目小于MaximumSize,Queue已经满,创建线程。如果线程数目达到MaximumSize,Queue满,拒绝任务,扔出RejectedExecutionException
任务队列的策略:
1. 不缓存。每一个任务进来立即处理,要求无界 maximumPoolSizes 以避免拒绝新提交的任务,适合处理有内部依赖的任务。
2. 无界队列。当线程达到CoreSize时,缓存任务,适合处理没有依赖的任务。
3. 有边界的队列。当使用有限的 maximumPoolSizes 时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O 边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU 使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。

相关推荐

    Java多线程之定时任务 以及 SpringBoot多线程实现定时任务——异步任务

    1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled

    Java进阶学习——Java多线程知识的理解

    Java多线程知识的理解0.前言1.从一道题目引入2.创建线程2.1.继承Thread类2.2.实现Runnable接口3.线程的生命周期4.线程安全4.1.为什么需要线程安全?4.2.如何实现线程安全?5.线程池5.1.为什么需要线程池?5.2.创建...

    java高手真经 光盘源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    多线程文章目录

    Java多线程①——线程知识梳理 有助于新手初步了解线程相关的知识同时加深对基础的理解。 了解线程的状态、常用方法以及Thread、Runnable、Callable、Future、FutureTask这些基础概念和简单应用。 Java多线程②——...

    Java高手真经(编程基础卷)光盘全部源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....

    Java线程池管理及分布式Hadoop调度框架搭建

    这里我们为大家分享上海创行科技技术总监严澜的博文——Java线程池管理及分布式Hadoop调度框架搭建。平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很...

    Java-learning:JAVA学习,包括:面试,多线程,JVM虚拟机,spring源码,mybatis源码等知识点-源码包

    1多线程 1.1如何设置线程池线程数? 任务一般可分为:CPU密集型,IO密集型,混合型,对于不同类型的任务需要分配不同大小的线程池。 CPU密集型任务 尽量使用较小的线程池,一般为CPU核心数+1 。因为CPU密集型任务...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    java多线程笔试题-hammer:二进制格式的解析器组合器,在C中。是的,在C中。什么?不要那样看着我

    java多线程笔试题Hammer 是一个解析库。 像许多现代解析库一样,它提供了一个解析器组合器接口,用于将语法编写为内联域特定语言,但 Hammer 也提供了各种解析后端。 它也是面向位而不是面向字符的,因此非常适合...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    目录回到顶部↑第1章 进驻爪哇岛——JAVA的基本语法. 1 1.1 讲解 2 1.1.1 爪哇岛的历史与演变 2 1.1.2 爪哇岛基本生存规则 4 1.1.3 爪哇岛上新人新风尚 11 1.2 练习 15 1.2.1 搭建Java开发环境 15 1.2.2 体验...

    这就是标题—— JUC.pdf

    多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...

    Java SE实践教程 源代码 下载

    目录回到顶部↑第1章 进驻爪哇岛——JAVA的基本语法. 1 1.1 讲解 2 1.1.1 爪哇岛的历史与演变 2 1.1.2 爪哇岛基本生存规则 4 1.1.3 爪哇岛上新人新风尚 11 1.2 练习 15 1.2.1 搭建Java开发环境 15 1.2.2 体验...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    目录回到顶部↑第1章 进驻爪哇岛——JAVA的基本语法. 1 1.1 讲解 2 1.1.1 爪哇岛的历史与演变 2 1.1.2 爪哇岛基本生存规则 4 1.1.3 爪哇岛上新人新风尚 11 1.2 练习 15 1.2.1 搭建Java开发环境 15 1.2.2 体验...

    Java网络编程(第三版)中文版.part09.rar

    ——Bruce Eckel,《Thinking in Java》的作者 内容简介回到顶部↑《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,...

    Java网络编程(第三版)中文版.part11.rar

    ——Bruce Eckel,《Thinking in Java》的作者 内容简介回到顶部↑《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,...

Global site tag (gtag.js) - Google Analytics