Java线程池提交线程任务的方法有四个:
- java.util.concurrent.ThreadPoolExecutor#execute
- java.util.concurrent.AbstractExecutorService#submit(java.util.concurrent.Callable)
- java.util.concurrent.AbstractExecutorService#submit(java.lang.Runnable)
- java.util.concurrent.AbstractExecutorService#submit(java.lang.Runnable, T)
通过源码可以看到,方法2、3、4最终会被封装成java.util.concurrent.RunnableFuture后,再次调用方法1,只不过会返回一个Future对象,用来获取任务执行结果。
方法3源码:
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
execute(Runnable command)方法执行时会分为三步:
注意:
- 提交一个任务时,不管当前线程池中的线程是否空闲,只要数量小于核心线程数就会创建新线程。
- ThreadPoolExecutor是非公平的,比如队列满了之后提交的Runnable可能会比正在排队的Runnable先执行(如果没有达到最大线程数时)。