Java线程池
前言
平时使用Java线程时,习惯于直接new Thread来创建一个线程,这种创建线程的方法随手就出来了,满足于我们一般的使用场景,但是每次new Thread都会产生一个对象,同时我们也知道这样的线程缺乏有效的管理,由此java推出了线程池,相对于直接new Thread,线程池有以下优点:
- 降低资源消耗
线程池可利用已存在线程,少了对象的创建,减少了性能开销
- 可有效管理线程
控制线程数、控制执行规则,控制并发数
Java线程池源码的介绍
前面大概介绍了线程池的优点,那么java中关于线程池的类有哪些?
接口Executor
java中线程池的接口为Executor,该接口提供了一个void execute(Runnable var1);方法,接受一个Runnable的任务。
package java.util.concurrent;
public interface Executor {
void execute(Runnable var1);
}
子类接口ExecutorService
Executor接口的子类ExecutorService封装了更多的方法:
public interface ExecutorService extends Executor {
void shutdown();//关闭命令,不再接受新的任务 如果还有未执行完的任务,则执行完之后之后关闭
List<Runnable> shutdownNow();//停止正在执行的任务,不再处理正在等待的任务
boolean isShutdown();//是否关闭,在调用shutdown之后返回true,其他返回false
boolean isTerminated();//立即判断 调用shutdown之后,在线程都执行完后返回true,其他返回false
//在指定时间后,判断是否已经关闭,如果关闭返回true,否则返回false
boolean awaitTermination(long var1, TimeUnit var3) throws InterruptedException;
//以下是提交线程的方法
<T> Future<T> submit(Callable<T> var1);
<T> Future<T> submit(Runnable var1, T var2);
Future<?> submit(Runnable var1);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1) throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> var1) throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException, ExecutionException, TimeoutException;
}
抽象子类AbstractExecutorService
ExecutorService接口的抽象实现类AbstractExecutorService,实现了ExecutorService接口中的提交线程的相关方法:
public abstract class AbstractExecutorService implements ExecutorService {
public Future<?> submit(Runnable var1) {
if(var1 == null) {
throw new NullPointerException();
} else {
RunnableFuture var2 = this.newTaskFor(var1, (Object)null);
this.execute(var2);
return var2;
}
}
public <T> Future<T> submit(Runnable var1, T var2) {
if(var1 == null) {
throw new NullPointerException();
} else {
RunnableFuture var3 = this.newTaskFor(var1, var2);
this.execute(var3);
return var3;
}
}
public <T> Future<T> submit(Callable<T> var1) {
if(var1 == null) {
throw new NullPointerException();
} else {
RunnableFuture var2 = this.newTaskFor(var1);
this.execute(var2);
return var2;
}
}
...
}
常用的实现子类ThreadPoolExecutor
抽象类AbstractExecutorService的子类ThreadPoolExecutor是我们常用到的一个类,具体实现了上面提到的未实现的方法,并提供了几种构造函数以及额外的判断方式,比如线程池大小、队列等,源码如下:
package java.util.concurrent;
public class ThreadPoolExecutor extends AbstractExecutorService {
...
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler