线程池

首先什么是Executors

Executors提供了一些方法来管理结束和可创建追踪多个异步任务执行进程的类:Future;
Executors的子类ExecutorService可被shut down,该方法调用会拒绝新的任务。
两个方法的区别:
shutdown():
允许已经执行的task继续执行,直到结束。此时不允许新的任务注册进来。
shutdownNow():
比较狠,其不仅阻止在等待的任务开始,且要终止当前运行的任务。
termination状态,意味着 ,一个exeutor没有任务在执行,也没有任务在等待执行,更没有新的任务被注册。
没有用到的ExecutorService应该被shut down。

Executors的几个创建方法

newCachedThreadPool()

创建线程池。其会应需求创建新线程,但会重用之前已构造出并仍存在的线程。线程池能够很明显的提高那种执行很多短小生命周期的程序的性能。
调用execute会重用之前已构造出并仍存在的线程。如果没有线程可用,会创建一个新的线程并添加到池中。
在池中的线程如果60s未被使用就会被终止,并从缓存中删除掉。因此,空闲状态下的池不会消耗任何的资源。

newCachedThreadPool (ThreadFactory threadFactory)

函数功能同上,为什么使用ThreadFactory,线程池每次创建新线程,都是通过调用ThreadFactory.newThread方法的,那么这里就提供了一个我们自定义thread的接口,继承接口ThreadFactory并实现newThread方法。
那么我们什么时候需要自定义ThreadFactory,主要是对thread的属性设置,比如daemon 状态,threadGroup ,thread name.
java提供了一个默认的ThreadFactory: defaultThreadFactory(),新创建的线程都在相同的ThreadGroup,并且是non-daemon,及权限设置,新线程的名字可通过getName获取,pool-N-thread-M ,N是ThreadFactory的序号,M是线程的序号。

newSingleThreadExecutor ()

只有一个工作线程的线程池,如果在这个线程里发生了异常(非shutdown),新线程会建立取代之并继续执行剩下的任务。任务确保顺序执行。同一个时间点有且仅有一个任务执行。

newSingleThreadScheduledExecutor ()

与上面的区别是,其能够规划在一个给定的延迟后再执行任务命令,或者周期性定时执行,这都是前面的线程池所不具备的功能。如果在这个线程里发生了异常(非shutdown),新线程会建立取代之并继续执行剩下的任务。任务确保顺序执行。

newScheduledThreadPool (int corePoolSize, ThreadFactory threadFactory)

类似上,区别在corePoolSize 是表明池中保持的线程的数量,即使空闲也保持。

newFixedThreadPool (int nThreads)

其实就是有nThreads个线程持续运行着,其他的和newCachedThreadPool类似

有效检测方法调用超时并处理
http://stackoverflow.com/questions/1164301/how-do-i-call-some-blocking-method-with-a-timeout-in-java

ExecutorService executor = Executors.newCachedThreadPool();
Callable task = new Callable() {
public Object call() {
return something.blockingMethod();
}
};
Future future = executor.submit(task);
try {
Object result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException ex) {
// handle the timeout
} catch (InterruptedException e) {
// handle the interrupts
} catch (ExecutionException e) {
// handle other exceptions
} finally {
future.cancel(); // may or may not desire this
}

你可能感兴趣的:(线程池)