zoukankan      html  css  js  c++  java
  • 使用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中的所有任务完成之后尽快退出。

  • 相关阅读:
    Round robin
    Linux命令之nslookup
    VLAN
    基础网络概念
    python开发_filecmp
    python开发_stat
    python开发_fileinput
    python开发_os.path
    python开发_bisect
    python开发_copy(浅拷贝|深拷贝)_博主推荐
  • 原文地址:https://www.cnblogs.com/dyfbk/p/7092060.html
Copyright © 2011-2022 走看看