(一)概述
1、Java线程池(Thread Pool)是一种基于池化思想管理线程的工具,用于在多线程服务器中有效地管 理和控制线程的生命周期,降低资源消耗,提高系统性能。线程池的概念与数据库连接池相似,通过维 护一组可复用的线程,避免了频繁地创建和销毁线程带来的开销。
2、原理:它维护多个线程,等待监督管理者分配可并发执行的任务。当有新的任务提交时,线程池会尝 试利用已有的线程来执行任务,如果线程池中的线程数量不足,线程池会根据一定的策略创建新的线程 来处理任务。任务执行完毕后,线程并不会立即销毁,而是返回到线程池中等待下一个任务。这种方式 有效地避免了线程数量膨胀导致的过分调度问题,同时也降低了线程的创建和销毁开销。
(二)优缺点
1、降低资源消耗:通过重复利用已创建的线程,降低了线程创建和销毁的开销。
2、提高响应速度:任务可以快速地分配到已有的线程中执行,提高了系统的响应性。
3、提高系统吞吐量:线程池可以并发执行多个任务,提高了系统的整体性能。
4、提供灵活的任务调度策略:线程池可以根据实际需求调整线程的数量和任务的调度方式。
(三)存在意义
1、没有线程池:
(1) 需要手动创建线程,还需要手动启动线程
(2) 在线程运行的过程中,如果出现了业务逻辑破坏力大的情况,线程有可能被破坏,业务逻辑执行到 一半就无法执行了,并且,业务逻辑也不能用新的线程继续执行
(3) 当业务逻辑非常简单的时候,也要创建线程对象,只是简单地使用线程之后,线程就会变成系统垃
圾无法再用,浪费系统资源
2、有线程池:
(1) 不需要手动创建线程,线程会自动完成线程创建
(2) 在业务逻辑破坏力大的时候,线程被破坏,线程池会安排其他线程继续执行没有执行完的业务逻辑
(3) 当业务非常简单,只需要将业务逻辑提交给线程池,线程会自动安排线程执行任务,任务执行完毕 后,线程不会变成系统垃圾,而是被线程池回收,继续在线程池中活跃,等待下一次提交任务
(四)线程池的使用
1、步骤:
(1) 获取线程池对象
(2) 创建任务对象
(3) 将任务提交到线程池中
2、获取线程对象:
(1) 工具类: Executors:用于生成线程池的工具类,根据需求可以指定线程池中线程的数量
(2) ExecutorServicenewFixedThreadPool(int nThreads) 创建一个线程池,线程数量由参数指定
(3) ExecutorServicenewSingleThreadExecutor() 创建一个只具有一条线程的线程池
3、创建任务对象:创建Runnable接口的实现类对象即可
4、将任务提交到线程池中:
(1) submit(Runnabletask) 将任务提交到线程池。当提交的任务数量大于池中线程数,现有的线程先 执行任务,当第一个线程将任务执行完毕后,紧接着执行后续排队的任务
(2) shutdown() 结束线程池。执行已经提交的任务,不接受新任务
(3) shutdownNow() 结束线程池。试图结束正在执行的任务,不执行已经提交的任务,不接受新任务