使用Executor管理Thread对象详解

  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中的所有任务完成之后尽快退出。

时间: 2025-01-13 14:00:39

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

SCOM管理包对象详解

*更多关于SCOM的详细内容,请关注我的资料* SCOM是通过管理包和代理共同完成被监视设备(被监视的设备也称之为SCOM代理)的性能和事件的收集,所以要让SCOM启动对服务器的监视,首先需要完成两个步骤: 下载.解压并在SCOM管理控制台将SCOM管理包导入SCOM运行数据库. 在要监视的服务器上安装SCOM代理. 安装在服务器上的SCOM代理和SCOM服务器之间构建起所有监视信息传递的通道,或者也可以理解成桥梁.该通道的作用如下: 负责分发SCOM策略给被监视的设备,比如开启或关闭某个组件的

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

ServletConfig与ServletContext对象详解 一.ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数.(配置在某个servlet标签或者整个web-app下) 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在 调用servlet的init方法时,将ServletConfig对象传递给

Thread 守护线程 Thread.setDaemon详解

java中线程分为两种类型:用户线程和守护线程.通过Thread.setDaemon(false)设置为用户线程:通过Thread.setDaemon(true)设置为守护线程.如果不设置次属性,默认为用户线程. 用户线程和守护线程的区别: 1. 主线程结束后用户线程还会继续运行,JVM存活:主线程结束后守护线程和JVM的状态又下面第2条确定. 2.如果没有用户线程,都是守护线程,那么JVM结束(随之而来的是所有的一切烟消云散,包括所有的守护线程). 补充说明: 定义:守护线程--也称“服务线程

java对象详解

java对象详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 java对象详解 HotSpot虚拟机中,对象在内存中存储的布局可以分为对象头,实例数据,对齐填充三个区域.本文所说环境均为HotSpot虚拟机.即输入java -version返回的虚拟机版本: java version "1.8.0_111" Java(TM) SE Runtime Environment (buil

(转)ServletConfig与ServletContext对象详解

ServletConfig与ServletContext对象详解 一.ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数.(配置在某个servlet标签或者整个web-app下) 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet.进而,程序员通过S

JS的window对象详解

一.说明 他是JS中最大的对象,它描述的是一个浏览器窗口,一般要引用他的属性和方法时,不需要用"Window.XXX"这种形式,而是直接使用"XXX".一个框架页面也是一个窗口. 二.Window窗口对象有如下属性 1.name 窗口的名称,由打开它的连接(<a target="...">)或框架页(<frame name="...">)或某一个窗口调用的 open() 方法(见下)决定.一般我们不会用

js中window对象详解以及页面跳转

js中window对象详解以及页面跳转 转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%90%9C/39219.shtml 1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp" 3. window.top.location.replace("index.asp");

JS中的event 对象详解

JS中的event 对象详解 JS的event对象 Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的元素: 3. button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下多个键,酒把这些值加起来,所以3就代表左右键同时按下:(firefox中 0代表左键,1代表中间键,2代表右键) 4. clientX/clientY:事件发生的时候,鼠标相对于浏览器窗口可视文档区域的

Android开发之AudioManager(音频管理器)详解

AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这个类的一个实例. 公有方法: Public Methods int abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) 放弃音频的焦点. void adjustStreamVolume(int streamType, int dir