java SE5的java.util.concurrent包中的执行器(Executor)是管理Thread对象的优选方法。使用Executor管理Thread对象可以简化并发编程。

  Executor是在客户端和任务执行之间提供了一个间接层,与客户端直接执行任务不同,我们将使用Executor来执行任务。Executor允许你管理异步任务的执行,而无须显示地管理线程的生命周期。

  线程对象知道如何运行具体的任务,它暴露了要执行的单一方法。ExecutorService(具有生命周期的Executor)知道如何构建恰当的上下文来执行runnable对象。

  ExecutorService对象是使用静态的Executor方法来创建的,这个方法可以确定其Executor类型

---------------------------------------CachedThreadPool----------------------------------------

ExecutorService exec = Executors.newCachedThreadPool();

  

  CachedThreadPool将为每个任务多创建一个线程,需要比较大的创建线程的开销。CachedThreadPool在程序中会创建与所需数量相同的线程,然后在它回收旧线程时停止创建,因此它是合理的Executor的首选。但是当这种方式会引发问题时,你就需要切换到FixedThreadPool。

--------------------------------------FixedThreadPool----------------------------------------------

ExecutorService exec = Executors.newFixedThreadPool(5);

  

  FixedThreadPool可以一次性预先执行代价高昂的线程分配,因此也就可以控制线程的数量。这可以节省时间,因为你不用为每个任务都固定地付出创建线程的开销。在事件驱动的系统中,需要线程的事件处理器,通过直接从池中获取线程哼,也可以尽快的得到服务。因为FixedThreadPool使用的Thread对象的数量是有限且确定的,所以你不会滥用可获得的资源。

--------------------------------------SingleThreadExecutor------------------------------------------

ExecutorService exec = Executors.newSingleThreadExecutor();

  SingleThreadExecutor就像是线程数量为1的FixedThreadPool。SingleThreadExecutor在你希望在另一个线程中连续运行的任何事物(长期存活的任务)来说是很有用的,例如监听进入的套接字连接的任务。同时在线程中运行的短任务也很方便,例如更新本地或远程日志的小任务或是事件分发线程。

  如果向SingleThreadExecutor提交了多个任务,那么这些任务将会排队执行,每个任务都会在下个任务开始之前运行结束,所有任务都使用相同的线程,安全性会得到提高。也就是说SingleThreadExecutor会序列化所有提交给它的任务,并会维护它自己(隐藏)的悬挂任务队列。

  SingleThreadExecutor可以确保任意时刻在任何线程中都只有唯一的任务在运行。在这种方法中,你不需要在共享资源上处理同步问题。通过序列化任务,你可以消除对序列化对象的需求。

---------------------------------------shutdown()--------------------------------------------------------

ExecutorService exec = Executors.newSingleThreadExecutor();
exec.shutdown();

  调用ExecutorService对象中的shutdown()方法可以防止新任务被提交给这个Executor,当前线程将继续运行在shutdown()被调用之前提交的所有任务。这个程序将在Executor中的所有任务完成之后尽快退出。

使用Executor管理Thread对象详解的更多相关文章

  1. Java线程创建形式 Thread构造详解 多线程中篇(五)

    Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...

  2. mvc-servlet---ServletConfig与ServletContext对象详解(转载)

    ServletConfig与ServletContext对象详解 一.ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...

  3. Linux内存管理之mmap详解

    转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用  ...

  4. 系统批量运维管理器Fabric详解

    系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...

  5. GridBagLayout布局管理器应用详解

    http://www.cnblogs.com/kungfupanda/p/7220217.html GridBagLayout布局管理器应用详解 很多情况下,我们已经不需要通过编写代码来实现一个应用程 ...

  6. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  7. Thread.setDaemon详解

    Thread.setDaemon详解 线程分为两种类型:用户线程和守护线程.通过Thread.setDaemon(false)设置为用户线程:通过Thread.setDaemon(true)设置为守护 ...

  8. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...

  9. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

随机推荐

  1. tcp连接是基于socket通信的吗

    https://zhidao.baidu.com/question/1305788160020716299.html ------ 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字 ...

  2. Python菜鸟之路:Django 信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 相当于我们创建了一个hook. 1. Django的内置信号 Mo ...

  3. cocos2d 场景切换和弹出场景、收回场景

    场景弹出收回很简单 用以下代码在任意一个地方显示“设置场景”: [[CCDirector sharedDirector] pushScene:[Settings scene]]; 如果你身处“设置场景 ...

  4. ios cocos2d 使用 sneakyInput 插件

    昨晚看了篇使用sneakyInput插件实现模拟手柄的代码,不过我加上后出现了很多问题.最后只看如何实现,没有自己动手去操作.今天终于吧问题都解决了.记录下来.也供别人参考. 首先要先加入libz.d ...

  5. django博客项目9

    ................

  6. 08 Spring框架 AOP (一)

    首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的 ...

  7. 2018 Multi-University Training Contest 1 - B Balanced Sequence (贪心)

    题意:对N个由(,)组成的字符串,求拼接后得到的最大的balance序列的长度.balance序列:空串/ A+B(A,B都是b序列)/ (+A+),A为b序列.此三种情况. 分析:在读入N每个字符串 ...

  8. nodejs两个例子

    1.nodejs多线程 var cluster=require("cluster");//ͨ¹ýcluster¿ÉÒÔ·Ö³öһЩ×ÓÏß³Ì var http=requir ...

  9. iOS 调整图片尺寸,告诉你的UI,别问我尺寸!我要最大的

    如果UI问你“这个图片你要多大尺寸的?”,你该怎么回答呢? 为了不让图片因拉伸或压缩而变形或模糊,请精确告诉UI图片的比例,至于图片的分辨率,不必要要求太严,但是最低要求是要让最大的屏幕不会出现前面描 ...

  10. SQL中的几个判断是否存在

    库是否存在if exists(select * from master..sysdatabases wherename=N'库名')print 'exists'elseprint 'not exist ...