开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
线程池
由于对线程的创建和销毁操作极其消耗资源,会占用大量资源,例如在并发情况下的线程,对性能影响非常大,那么这个问题该如何解决呢?
为了解决这个问题,可以做一个设想,如果提前创建很多线程,并把这些线程统一存放到一个线程池中,这样在使用到线程的时候就不再创建了,直接从这些线程池中取,用完后也不进行销毁了,直接放回线程池中,这样就可以避免频繁创建和销毁线程,从而实现线程的重复利用,这种方式类似生活中的公共交通工具,这么做的好处是可以提高响应速度,减少创建新线程的时间,也可以降低资源的消耗,重复利用线程池中的线程,不再需要每次都创建一遍了,另外,这种方式也利于线程的管理。
线程池的属性
- corePoolSize:核心的大小。
- maximumPoolSize:最大线程数。
- keepAliveTime:线程没有任务时最多保持多长时间后终止。
Java中使用线程池
-
java的jdk提供了使用线程池的API:ExcutorService和Executors。
-
EcecutorService是真正的线程池接口,他的最常用子类是ThreadPlloExecutor。
-
void execute(Runnable command):该函数没有返回值,主要用来执行Runnable,即执行任务或者命令的函数。
-
Futuresubmit(Callable task):执行任务,有返回值,一般用来执行Callable。
-
void shutdown():该函数用来关闭连接池。
-
Executors:该类是工具类,即线程池的工厂类,主要用来创建并返回不同类型的线程池。
代码示例
* @param task the task to submit
* @param <T> the type of the task's result
* @return a Future representing pending completion of the task
* @throws RejectedExecutionException if the task cannot be
* scheduled for execution
* @throws NullPointerException if the task is null
*/
<T> Future<T> submit(Callable<T> task);//向线程池提交单个异步任务