JDK7中Executors源码概述
来源:互联网 发布:c语言不等于号怎么打 编辑:程序博客网 时间:2024/06/05 09:27
Executors是java.util.concurrent包下的实现类,其定义了Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类的工厂和实用方法。此类支持以下各种方法:
(1)创建并返回设置有常用配置字符串的ExecutorService的方法
(2)创建并返回设置有常用配置字符串的ScheduledExecutorService的方法
(3)创建并返回"包装的"ExecutorService方法,它通过使特定于实现的方法不可访问来禁用重新配置
(4)创建并返回ThreadFactory的方法,它可将新创建的线程设置为已知的状态
(5)创建并返回非闭包形式的Callable的方法,这样可将其用于需要Callable的执行方法中
基本使用方法:
public class ExecutorServiceTest {
public static void main(String[] args) throws InterruptedException, ExecutionException{
ExecutorService single = Executors.newSingleThreadExecutor();
single.execute(new Runnable(){
@Override
public void run(){ }
Future<?> futureRunnable = fixed.submit(new Runnable(){
@Override
public void run(){ }
Future<?> futureCallable = cached.submit(new Callable<Object>() {
@Override
public Object call() throws Exception{ }
});
System.out.println("Callable results:" + futureCallable.get());
fixedRate.scheduleAtFixedRate(new ScheduledExecutorTask("job_1"), 1, 1, TimeUnit.SECONDS);
Thread.sleep(1500);
fixedDelay.scheduleWithFixedDelay(new ScheduledExecutorTask("job_2"), 5, 5, TimeUnit.SECONDS);
}
}
方法实现概述:
public static ExecutorService newFixedThreadPool(int nThreads);
创建一个可重用固定线程数的线程池【nThreads<=0会抛出参数异常】,以共享的无界队列方式来运行这些线程。在任意点,在大多数nThreads线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor();
创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newCachedThreadPool();
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有60秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用ThreadPoolExecutor构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
参数:corePoolSize-池中所保存的线程数,即使线程是空闲的也包括在内。
抛出:NullPointerException-如果threadFactory为null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public static ScheduledExecutorService newSingleThreadScheduledExecutor();
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程会代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其它等效的newScheduledThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}
Executors中还提供了其它方法来实现线程池的初始化,但是其实现都大同小异,例如:newFixedThreadPool(int nThreads,ThreadFactory threadFactory),这里使用自定义的ThreadFactory来创建线程。ScheduledExecutorService通常被用来替代TimerTask。无论是直接使用ThreadPoolExecutor来实现线程池的初始化,还是使用其相关包装代理类,其底层对于线程池的初始化都是采用给定的初始参数来创建新的ThreadPoolExecutor。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
参数:
corePoolSize-池中所保存的线程数,包括空闲线程
maximumPoolSize-池中允许的最大线程数
keepAliveTime-当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
unit-keepAliveTime参数的时间单位
workQueue-执行前用于保持任务的队列,此队列仅保持由execute方法提交的Runnable任务
threadFactory-执行程序创建新线程时使用的工厂
handler-由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序
抛出:
IllegalArgumentException-如果corePoolSize或keepAliveTime小于0,或者maximumPoolSize小于等于0,或者corePoolSize大于 maximumPoolSize。
(1)创建并返回设置有常用配置字符串的ExecutorService的方法
(2)创建并返回设置有常用配置字符串的ScheduledExecutorService的方法
(3)创建并返回"包装的"ExecutorService方法,它通过使特定于实现的方法不可访问来禁用重新配置
(4)创建并返回ThreadFactory的方法,它可将新创建的线程设置为已知的状态
(5)创建并返回非闭包形式的Callable的方法,这样可将其用于需要Callable的执行方法中
基本使用方法:
public class ExecutorServiceTest {
public static void main(String[] args) throws InterruptedException, ExecutionException{
ExecutorService single = Executors.newSingleThreadExecutor();
single.execute(new Runnable(){
@Override
public void run(){ }
});
Future<?> futureRunnable = fixed.submit(new Runnable(){
@Override
public void run(){ }
});
Future<?> futureCallable = cached.submit(new Callable<Object>() {
@Override
public Object call() throws Exception{ }
});
System.out.println("Callable results:" + futureCallable.get());
cached.shutdown();
fixedRate.scheduleAtFixedRate(new ScheduledExecutorTask("job_1"), 1, 1, TimeUnit.SECONDS);
Thread.sleep(1500);
fixedRate.shutdown();
fixedDelay.scheduleWithFixedDelay(new ScheduledExecutorTask("job_2"), 5, 5, TimeUnit.SECONDS);
}
}
方法实现概述:
public static ExecutorService newFixedThreadPool(int nThreads);
创建一个可重用固定线程数的线程池【nThreads<=0会抛出参数异常】,以共享的无界队列方式来运行这些线程。在任意点,在大多数nThreads线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor();
创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newCachedThreadPool();
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有60秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用ThreadPoolExecutor构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
参数:corePoolSize-池中所保存的线程数,即使线程是空闲的也包括在内。
抛出:NullPointerException-如果threadFactory为null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public static ScheduledExecutorService newSingleThreadScheduledExecutor();
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程会代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其它等效的newScheduledThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}
Executors中还提供了其它方法来实现线程池的初始化,但是其实现都大同小异,例如:newFixedThreadPool(int nThreads,ThreadFactory threadFactory),这里使用自定义的ThreadFactory来创建线程。ScheduledExecutorService通常被用来替代TimerTask。无论是直接使用ThreadPoolExecutor来实现线程池的初始化,还是使用其相关包装代理类,其底层对于线程池的初始化都是采用给定的初始参数来创建新的ThreadPoolExecutor。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
参数:
corePoolSize-池中所保存的线程数,包括空闲线程
maximumPoolSize-池中允许的最大线程数
keepAliveTime-当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
unit-keepAliveTime参数的时间单位
workQueue-执行前用于保持任务的队列,此队列仅保持由execute方法提交的Runnable任务
threadFactory-执行程序创建新线程时使用的工厂
handler-由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序
抛出:
IllegalArgumentException-如果corePoolSize或keepAliveTime小于0,或者maximumPoolSize小于等于0,或者corePoolSize大于 maximumPoolSize。
NullPointerException-如果workQueue,threadFactory或handler为null
实现可参考:https://github.com/chunericli/wise-utils
阅读全文
0 0
- JDK7中Executors源码概述
- JDK7中Condition源码概述
- JDK7中Lock源码概述
- JDK7中ReadWriteLock源码概述
- JDK7中Executor源码概述
- JDK7中ExecutorService源码概述
- JDK7中ThreadPoolExecutor源码概述
- JDK7中Runnable和Callable源码概述
- JDK7中BlockingQueue和Queue源码概述
- JDK7中ThreadFactory和RejectedExecutionHandler源码概述
- JDK7中Future,FutureTask和RunnableFuture源码概述
- JDK7中LockSupport源码解析
- JDK7中AtomicInteger源码解析
- JDK7中ArrayBlockingQueue源码解析
- JDK7中LinkedBlockingQueue源码解析
- JDK7中SynchronousQueue源码解析
- JDK7中StringBuffer/StringBuilder源码解析
- JDK7中ReentrantLock源码解析(1)
- Android 6.0动态申请权限
- JDBC纯驱动连接MySQL
- BZOJ 1296 [SCOI2009]粉刷匠
- 初识java多线程
- C#+AE加载shape图层
- JDK7中Executors源码概述
- 点菜系统e-r图
- STL学习之string类
- 05Python中的number数据类型
- cvCloneImage()内存泄漏解决方法, cvCloneImage()和cvCopy()的区别
- Jzoj4747 被粉碎的线段树
- js常见报错之Unexpected token in JSON at position
- 量子计算
- 最长公共子串(动态规划)