笔记:多线程-执行器

构建一个线程是有一定的代价的,因为涉及和操作系统的交互,如果程序中创建了大量的生命周期很短的线程,这时应该使用线程池(Thread
Pool),一个线程池包含了等待运行的空闲线程,将 Runnable 对象传递给线程池,就会有一个线程调用 run 方法,当 run 方法结束时,线程不会死亡,而是在线程池中准备为下一个请求提供服务,Executors 类有许多静态工厂方法用来构建线程池,方法如下:

  • newCachedThreadPool:必要时创建新线程,空闲线程会被保留60秒
  • newFixedThreadPool:该线程池包含固定数量的线程,空闲线程会被一直保留
  • newSingleThreadExecutor:只有一个线程的线程池,该线程池顺序执行每一个提交的任务
  • newScheduledThreadPool:用于预定(计划)执行而创建的固定线程池,替代 java.util.Timer
  • newSingleThreadScheduledExecutor:用于预定(计划)执行而构建的单线程池

newCachedThreadPool、newFixedThreadPool

newSingleThreadExecutor方法的返回实现了
ExecutorService 接口的 ThreadPoolExecutor 类的对象,接口定义如下:

public interface ExecutorService extends Executor {

????????void
shutdown();

????????List<Runnable> shutdownNow();

????????boolean
isShutdown();

????????boolean
isTerminated();

????
?

????????<T> Future<T> submit(Callable<T> task);

????????<T> Future<T> submit(Runnable task, T result);

????????Future<?> submit(Runnable task);

?
?

????????<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

????????????????throws InterruptedException;

????????<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,

????????????????????????????????????????????????????????????????????long timeout, TimeUnit unit)

????????????????throws InterruptedException;

????????????????
?

????????<T> T invokeAny(Collection<? extends Callable<T>> tasks)

????????????????throws InterruptedException, ExecutionException;

????????<T> T invokeAny(Collection<? extends Callable<T>> tasks,

????????????????????????????????????????long timeout, TimeUnit unit)

????????????????throws InterruptedException, ExecutionException, TimeoutException;

}

可以使用
submit
方法,将
Runnbale 或 Callable 对象提交给 ExecutorService,submit方法的详细说明如下:

  • ?<T> Future<T> submit(Callable<T> task)
    :该方法提交
    Callable,并且返回的 Future 对象将在计算结果准备好的时候得到他。
  • <T> Future<T> submit(Runnable task, T result):该方法提交
    Runnable,并且
    Future 的 get方法在完成的时候返回指定的 result 对象
  • Future<?> submit(Runnable task):该方法提交
    Runnable,但是
    Future 的 get 方法只是简单的返回 null。

当用完一个线程池的时候,调用
shutdown
方法,该方法启动该线程池的关闭序列,被关闭的线程池不再接受新的任务,当所有任务都完成以后,线程池中的线程死亡。如果调用
shutdownNow方法,则取消尚未开始的所有任务,并试图中断正在运行的线程。如果需要对线程池对象进行更详细的访问,需要使用
ThreadPoolExecutor 类的方法获取。

newScheduledThreadPool

newSingleThreadScheduledExecutor线程池,用于预定义或者重复执行的线程池,方法返回了实现
ScheduledExecutorService接口的对象,接口定义如下:

public interface ScheduledExecutorService extends ExecutorService {

????????public ScheduledFuture<?> schedule(Runnable command,?long delay, TimeUnit unit);

????????public <V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);

????????public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,?long initialDelay,

????????????????????????????????????????????????????????????????????????????????????????????????????long period,TimeUnit unit);

????????public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,

???????????????????????????????????????????????????????????????????????????????????????????????long delay,TimeUnit unit);

}

schedule 方法,预定在指定的时间之后执行任务;scheduleAtFixedRate 预定在初始的延迟结束后,周期性的运行给定的任务,周期长度时 period;scheduleWithFixedDelay 预定在初始的延迟结束后周期性的给定任务,在一次调用完成和下一次调用开始之间有长度为 delay 的延迟。

可以使用
invokeAny
方法提交一个Callable对象的集合,并返回某个已经完成了的任务的结果,无法知道返回的是哪个;invokeAll
方法是提交一个Callable对象的集合,并返回一个Future对象的列表,表示所有任务的完成结果列表。

?
?

时间: 2024-11-05 13:27:39

笔记:多线程-执行器的相关文章

IOS学习笔记 -- 多线程

多线程1.多线程的原理 1>.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 2>.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 3>.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象如果线程非常非常多,会发生: 1>.CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源 2>.每条线程被调度执行的频次会降低(线程的执行效率降低) 2.多线程的优缺点 1>.多线程的优点 能适当提高程序的执行效率 能适当提高资源

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

java笔记--多线程基础

多线程技术 在java中实现多线程技术有两种方式: 1.继承Thread类: 2.实现Runnable接口 这两种方法都需要重写run()方法:通常将一个新线程要运行的代码放在run()方法中(这是创建没有返回值线程的方法)由于java只支持单继承,当类已经继承有其他类时,只能选择实现Runnable接口在启动线程时需要使用Thread类的start()方法,而不是直接使用run()方法: 如: public static void function() { for (int i = 0; i

[开发笔记]-多线程异步操作如何访问HttpContext?

如何获取文件绝对路径? 在定时器回调或者Cache的移除通知中,有时确实需要访问文件,然而对于开发人员来说, 他们并不知道网站会被部署在哪个目录下,因此不可能写出绝对路径, 他们只知道相对于网站根目录的相对路径,为了定位文件路径,只能调用HttpContext.Current.Request.MapPath或者 HttpContext.Current.Server.MapPath来获取文件的绝对路径. 如果HttpContext.Current返回了null,那该如何如何访问文件? 其实方法并非

Linux程序设计学习笔记----多线程编程之线程同步之条件变量

转载请注明出处:http://blog.csdn.net/suool/article/details/38582521. 基本概念与原理 互斥锁能够解决资源的互斥访问,但是在某些情况下,互斥并不能解决问题,比如两个线程需 要互斥的处理各自的操作,但是一个线程的操作仅仅存在一种条件成立的情况下执行,一旦错过不可再重现,由于线程间相互争夺cpu资源,因此在条件成立的时候,该线程不一定争夺到cpu而错过,导致永远得不到执行..... 因此需要某个机制来解决此问题,更重要的是,线程仅仅只有一种情况需要执

JAVA学习笔记 -- 多线程之共享资源

在多线程程序运行过程中,可能会涉及到两个或者多个线程试图同时访问同一个资源.为了防止这种情况的发生,必须在线程使用共享资源时给资源"上锁",以阻挡其它线程的访问.而这种机制也常常被称为互斥量,本文主要介绍它的两种方式synchronized和Lock . 1.synchronized 当任务要执行被synchronized关键字保护的代码片段的时候,它会检查锁是否可用,然后获取锁,执行代码,释放锁.synchronized也有两种用法: A.synchronized方法 import

Linux程序设计学习笔记----多线程编程基础概念与基本操作

转载请注明出处,http://blog.csdn.net/suool/article/details/38542543,谢谢. 基本概念 线程和进程的对比 用户空间资源对比 每个进程在创建的时候都申请了新的内存空间以存储代码段\数据段\BSS段\堆\栈空间,并且这些的空间的初始化值是父进程空间的,父子进程在创建后不能互访资源. 而每个新创建的线程则仅仅申请了自己的栈,空间,与同进程的其他线程共享该进程的其他数据空间包括代码段\数据段\BSS段\堆以及打开的库,mmap映射的文件与共享的空间,使得

《Java核心技术卷一》笔记 多线程

有时,我们需要在一个程序中同时并行的处理多个任务,如播放器一边要播放音乐同时还要不断更新画面显示,或者是一边执行耗时任务,UI还能一边继续响应各种事件.还有的时候,一个任务需要很长时间才能完成,如果分成多份一起执行,可以极大的缩短需要的时间.多线程可以很好的解决这类问题. 一个程序(进程)如果可以同时执行多个任务,每个并行的任务都是通过一个线程来完成,这就是一个多线程程序.进程拥有自己的一整套数据(变量),各个线程共享进程的数据,线程间通信比进程间通信更简单,线程开销比进程小. Java中为多线

11.1-全栈Java笔记:多线程技术的基本概念

多线程是JAVA语言的重要特性,大量应用于网络编程.应用于服务器端程序的开发.以及最常见的UI界面底层原理.操作系统底层原理都大量使用了多线程. 我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层就是多线程的应用.UI界面的主线程绘制界面,如果有一个耗时的操作发生则启动新的线程,完全不影响主线程的工作.当这个线程工作完毕后,再更新到主界面上. 我们可以上百人.上千人.上万人同时访问某个网站,其实,网站服务器也是基于多线程的原理.如果没有多线程,服务器处理速度会极大降低. 多线程应用于计算机的