线程池的一些方法
提交线程任务
threadPool.submit(Runnable task)
threadPool.submit(Callable<T> task)
关闭线程池
/*
调用这个方法线程池不会立即关闭,而是会等到所有线程执行完毕,还有
阻塞队列中的任务执行完毕后,再关闭。在此期间,线程池也会启用拒绝策略,
拒绝新的任务提交
*/
threadPool.shutdown()
/*
调用这个方法,它会给所有线程发送 interrupt信号,尝试中断这些任务,然
后将任务队列中的任务转移到一个list中并返回,接下来就看你要不要处理了
*/
threadPool.shutdownNow()
测试下其它方法
public class ThreadPoolMethod{
public static void main(String[] args) {
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(6, 10, 3l, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
for (int i = 0; i < 20; ++i){
threadPool.submit(thread);
System.out.println("-------------------------------------------------------------");
System.out.println("线程池的核心线程数:" + threadPool.getCorePoolSize());
System.out.println("线程池的历史中存在的最大线程数的个数:" + threadPool.getLargestPoolSize());
System.out.println("线程池允许创建的最大线程数:" + threadPool.getMaximumPoolSize());
System.out.println("线程池中当前的线程数:" + threadPool.getPoolSize());
System.out.println("线程池中当前队列:" + threadPool.getQueue());
System.out.println("线程池中曾经执行完成过的任务的大致总数:" + threadPool.getCompletedTaskCount());
System.out.println("线程池中曾经计划的任务的大致总数:" +threadPool.getTaskCount());
System.out.println("线程池中当前的拒绝策略:" + threadPool.getRejectedExecutionHandler());
}
}
}
首先呢,自己手动创建了一个线程池:
- 核心线程为:6
- 最大线程数为:10
- 空闲线程存活时间:3L
- 空闲线程存活时间的单位:秒
- 阻塞队列:ArrayBlockingQueue(4),最多可以放4个任务,跟Array数组不同,它一经创建,长度就是不可以改变了
- 创建线程的工厂:Executors.defaultThreadFactory(),我用了默认的创建线程的工厂,虽然不知道里面实现的样子,有兴趣的可以自己看
- 拒绝策略:AbortPolicy,当阻塞队列满了且创建的线程数超出最大的线程数,线程池会抛出 RejectedExecutionException,这时候你就可以根据这个异常来看怎么处理了。当然了,这个是AbortPolicy才有的,如果是其它拒绝策略就有所不同了(功能上)
getCorePoolSize
获取核心线程数,这不是显示当前的线程数,是总共可以创建多少个核心线程数
getLargestPoolSize
之前线程池中,存在过的最大线程的数目
getMaximumPoolSize
获取当前线程池允许创建的最大线程数
getPoolSize
获取当前存活在线程池中的线程的个数
getQueue
获取当前队列中存在的任务
getCompletedTaskCount
获取曾经执行完成过的任务大致总数,为啥是大致呢?因为你在调用的时候,要是刚好有个线程完成任务,那数量就变化了
getTaskCount
获取当前线程曾经计划执行的个数,也就是执行过了多少个线程,启动的时候就算数的
getRejectedExecutionHandler
获取当前线程池的拒绝策略
其实还有几个方法,但突然不想写了
欢迎大家关注下个人的「公众号」:独醉贪欢