Java多线程 之 执行器Executor(二)

原创 2016年06月01日 22:01:03

java多线程很少像前面的例子那样直接使用Thread.start()方法来驱动。而是使用执行器Executor来管理线程。执行器是启动任务的最佳方法。
ExecutorService(一个具有服务生命周期的执行器)知道如何创建恰当的上下文来执行Runnable对象。请看下面的例子(其中LiftOff参见上一篇文章):

package org.fan.learn.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * Created by thinkpad on 2016/6/1.
 */
public class ExecutorTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            executorService.execute(new LiftOff());
        }
        executorService.shutdown();
        System.out.println("Waiting for liftOff!");
    }
}

执行结果如下所示:
Waiting for liftOff!
Task(0)#9 Task(1)#9 Task(2)#9 Task(0)#8 Task(1)#8 Task(3)#9 Task(4)#9 Task(2)#8 Task(0)#7 Task(1)#7 Task(3)#8 Task(4)#8 Task(2)#7 Task(0)#6 Task(1)#6 Task(3)#7 Task(4)#7 Task(2)#6 Task(0)#5 Task(1)#5 Task(3)#6 Task(4)#6 Task(2)#5 Task(0)#4 Task(1)#4 Task(3)#5 Task(4)#5 Task(2)#4 Task(0)#3 Task(1)#3 Task(3)#4 Task(4)#4 Task(2)#3 Task(0)#2 Task(1)#2 Task(3)#3 Task(4)#3 Task(2)#2 Task(0)#1 Task(1)#1 Task(3)#2 Task(4)#2 Task(2)#1 Task(0)#liftOff Task(1)#liftOff Task(3)#1 Task(4)#1 Task(2)#liftOff Task(3)#liftOff Task(4)#liftOff

注意,上面对shutdown方法的调用:
调用shutdown方法可以防止新任务被提交到这个执行器,当前线程(即驱动main的线程,其实这个线程是由操作系统创建的。例如在linux的shell中执行一个命令,其实是由shell fork出了一个进程来执行的)会继续运行在shutdown被调用之前提交的所有任务。这个当前线程将在执行器中的所有任务完成之后退出。
CachedThreadPool将在线程执行过程中创建与所需数量相同的线程,而且在它开始对旧线程回收时将停止创建新的线程。CachedThreadPool每当用到新线程时就创建一个线程,而创建线程的开销是很大的,但是在Thinking in Java中,却说CachedThreadPool是合理的执行器的首选。
除了CachedThreadPool之外还有FixedThreadPool。可以给Executors.newFixedThreadPool传递一个参数,表示线程池中线程的是数量。这样,程序在执行过程中就可以直接使用线程池中的线程,而不用花费很大在线程创建上。但是也有一个弊端就是,线程数量已经固定,无法按照需要再创建新的线程。
在Thinking in java中有这么一句话:在任何线程池中,现有线程在可能的情况下,都会被自动复用。也就是说,CachedThreadPool中的线程也会被复用。
SingleThreadPool是线程数量为1的FixedThreadPool。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java多线程 学习笔记(二)——线程执行器 Executor

在JDK5中提供了 java.util.concurrent包下的Executor来管理Thread对象,从而简化了并发编程。Executor在客户端和子线程之间提供了一个中间层,由这个类的对象来管理...

Java多线程-执行器

本文参考:《Thinking in Java》 我们在上一篇中知道,可以使用thread的构造器中接收Runnable对象,然后调用start方法开启线程。但是java.util.concurren...
  • pusude
  • pusude
  • 2017年03月24日 16:04
  • 250

java使用Executor(执行器)管理线程

v一.一个实现了Runnable接口的类 class MyThread implements Runnable{ private static int num = 0; @O...

java.util.concurrent 并发框架,异步执行器 Executor

目录(?)[-] 注意重点看 16 17 18javautilconcurrent - Java 并发工具包 半成品 阻塞队列 BlockingQueue BlockingQueue 用法Blo...

Java多线程之使用执行器(Executors)(Thinking in Java)

JavaSE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor在客户端和任务执行之间提供了一个间接层;与客户端...

java.util.concurrent 并发框架,异步执行器 Executor

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Ja...

Java执行器框架(Executor Framework)提供了 ThreadPoolExecutor

Java执行器框架(Executor Framework)提供了 ThreadPoolExecutor ,通过线程池来执行并发任务从而避免了所以线程的创建操作。当发送一个任务给执行器后,根据执行器的配...

从头认识java-17.7 执行器(Executor)

这一章节我们来讨论一下Executor的第一个话题线程池。1.什么是线程池?(下面的解释来自http://baike.haosou.com/doc/2511076-2653416.html)线程池是一...

关于Maptask任务单线程与多线程执行器解读

相比Mpareduce 老版本的API, 新版本的API 在maptask执行map任务的接口设计上有比较大的改动。   在老版的API中, MapRunner的run函数中: public vo...

MyBATIS原理第三篇: SqlSession下的四大对象之一——执行器(executor)

首先我先解释一下标题 四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象。(为了方便下面的文章说道四大对象就专指它们)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java多线程 之 执行器Executor(二)
举报原因:
原因补充:

(最多只允许输入30个字)