Thread和ExecutorService的区别

使用Thread,当子线程执行结束后,主线程如果没有其他执行任务,主线程会终止。

/**
* Created by litao on 15/10/7.
*/
public class ThreadTest { public static void main(String[] args)
{
Thread threadA=new Thread()
{
@Override
public void run() {
super.run();
System.out.println("This is a test");
}
};
threadA.start(); }
}

结果:

This is a test

Process finished with exit code 0

使用ExecutorService,当子线程执行结束后,主线程如果没有其他执行任务,主线程并不会退出,除非在主线程调用了ExecutorService.shutdown()或者ExecutorService.shutdownNow()

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by litao on 15/10/8.
*/
public class ExecutorServiceTest { public static void main(String[] args)
{
ExecutorService service= Executors.newFixedThreadPool(3);
service.submit(new Runnable() {
public void run() {
System.out.println("sub thread");
}
}); System.out.println("main thread");
} }

结果:

sub thread

main thread

/* 程序并没有退出 */

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by litao on 15/10/8.
*/
public class ExecutorServiceTest { public static void main(String[] args)
{
ExecutorService service= Executors.newFixedThreadPool(3);
service.submit(new Runnable() {
public void run() {
System.out.println("sub thread");
}
}); System.out.println("main thread");
service.shutdown();
} }

结果:

main thread

sub thread

Process finished with exit code 0

结论: 在使用ExecutorService处理多线程任务时,当任务执行完毕后,需要调用ExecutorService.shutdown()关闭线程池。

ExecutorService中几个提交任务的方法

execute(Runnable): 继承自executor接口,在线程池中执行一个单独的不需要返回值的任务。

<T> Future<T> submit(Callable<T> task): 在线程池中执行一个需要有返回值的任务。 通过Future.get()方法获取任务执行结果。

<T> Future<T> submit(Runnable task, T result): 在线程池中执行一个不需要有返回值的任务,当任务执行结束(不管任务是否被中断),Future.get()可以获得指定的result值。

Future<?> submit(Runnable task):在线程池中执行一个不需要有返回值的任务,当任务执行结束,,Future.get()返回null

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException: 执行tasks集合中的任务,当所有的任务执行结束后,按照任务提交的顺序返回记录任务执行结果和状态的Future类型的list集合 。invokeAll会阻塞直到返回Future类型的list集合。

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException:

和上面的invokeAll作用相同,增加了阻塞超时的判断。当超时返回值后,线程池中没有执行结束的任务会被中断(cancel)。

<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException:

执行tasks集合中的任务,当某一个任务执行结束后,返回该任务的返回值。

<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException:

和上面的invokeAny作用相同,增加了阻塞超时的判断。当超时返回值后,线程池中没有执行结束的任务会被中断(cancel)。

主线程在调用submit()或excute()方法后,并不会造成自己的阻塞,但是调用invokeAll()和invokeAny()方法会造成自己的阻塞。

调用future.get()方法会阻塞调用的主线程。当future对应的线程已经被阻塞,方法返回InterruptedException

ExecutorService介绍2的更多相关文章

  1. ExecutorService介绍

    转自: http://victorzhzh.iteye.com/blog/1010359 下面是excutor相关的类结果: ExecutorService接口继承了Executor接口,定义了一些生 ...

  2. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  3. Executor(一)ExecutorService 线程池

    Executor(一)ExecutorService 线程池 本篇主要涉及到的是 java.util.concurrent 包中的 ExecutorService.ExecutorService 就是 ...

  4. Java线程池 ExecutorService

    一.ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法:  ...

  5. Java线程池 ExecutorService了解一下

    本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 E ...

  6. java 线程池 ExeutorService

    Java线程池 ExecutorService 原文:https://blog.csdn.net/suifeng3051/article/details/49443835/ 本篇主要涉及到的是java ...

  7. Executor线程池

    Executor线程池框架: 使用线程池的优点: 1.重用存在的线程 2.减少对象创建.消亡的开销 3.性能佳 4.可有效控制最大并发线程数,提高系统资源的使用率 5.避免过多资源竞争,避免堵塞 6. ...

  8. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  9. 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术

    这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...

随机推荐

  1. SDWebImage 原理及使用

    这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. SDWebImage 加载图片的流程 入口 setImageWi ...

  2. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  3. Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群

    Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群 >>>>>>>>>>>> ...

  4. ionic 项目分享【转】

    写在文章前:由于最近研究ionic框架,深感这块的Demo寥寥可数,而大家又都藏私,堂堂天朝,何时才有百家争鸣之象,开源精神吾辈当仁不让! 由于昨晚找资料太匆匆 忘记出处了,记得是在http://bb ...

  5. Spring入门Hello World

    这里是关于Hello World的一些基本的操作 Spring 是一个重量级的容器框架,用来配置bean并维护bean之间的关系的框架 想要最初的使用Spring就要学会最基本的配置 <1> ...

  6. 样式 style="clear:both"

    <div style="clear:both"></div>clear:both该属性的值指出了不允许有浮动对象的边.通俗的讲:这段代码的做用是:清除同行元 ...

  7. 使用Preference保存设置

    http://blog.csdn.net/barryhappy/article/details/7381544 Android中有四种持久化数据的方法:SQLite数据库.文件存储.Preferenc ...

  8. font awesome icon

    http://fontawesome.io/icons/ http://www.bootstrapicons.com/

  9. shell脚本学习之Bash shell 里各种括号的用法

    今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...

  10. 在 Mac OS X 中建立加密的 Zip 压缩 -- 让机密资料加上密码

    在 Mac OS X 中要压缩档案的話,基本上就用滑鼠点右鍵选「压缩...」就可以制作 Zip 格式的压缩档,很方便.但如果是机密的资料要透过 Email 等管道传送时,常常会需要建立加密的 Zip ...