码迷,mamicode.com
首页 > 编程语言 > 详细

笔记:多线程-执行器

时间:2017-04-25 23:36:42      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:err   空闲   mit   executor   extends   微软雅黑   重复执行   thread   线程   

构建一个线程是有一定的代价的,因为涉及和操作系统的交互,如果程序中创建了大量的生命周期很短的线程,这时应该使用线程池(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对象的列表,表示所有任务的完成结果列表。

? ?

笔记:多线程-执行器

标签:err   空闲   mit   executor   extends   微软雅黑   重复执行   thread   线程   

原文地址:http://www.cnblogs.com/li3807/p/6765040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!