线程池|Java多线程

52 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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);//向线程池提交单个异步任务