赞
踩
Java线程的创建非常昂贵,需要JVM和OS(操作系统)配合完成大量的工作:
Java高并发应用频繁创建和销毁线程的操作是非常低效的,而且是不被编程规范锁允许的。在Java中,线程的销毁(即线程结束其执行并释放资源)本身并不是一个效率特别低下的操作,但它可能涉及一些开销,尤其是在大量线程频繁创建和销毁的场景中。以下是一些影响线程销毁效率的因素:
通过重复利用已经创建的线程降低线程创建和销毁造成的消耗。
当任务到达时,任务可以不需要等到线程创建就能立即执行。
进行统一分配、调优和监控。
Java中线程池是通过Executor框架实现,该框架中用到了Executor、Executors(代表工具类)、ExecutorService、ThreadPoolExecutor这几个类
Executors 是 Java 并发包 java.util.concurrent 中的一个工具类,它提供了一组用于创建线程池的方法。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的 ThreadFactory 创建一个新线程。
Executors 工具类的主要目的是简化线程池的创建和管理。通过它,你可以很容易地创建固定大小的线程池、可缓存的线程池、定时线程池等,而无需手动处理 ThreadPoolExecutor 的复杂配置。
创建一个固定大小的线程池。如果所有线程都在工作,那么新提交的任务会在一个队列中等待,直到有线程可用。
new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
创建一个不限制线程数量的线程池,任何提交的任务都将立即执行,但是空闲线程会得到及时回收。
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>())
创建一个单线程的线程池。这意味着在任何时候,都只有一个任务在执行。
new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>())
创建一个定时线程池,它可以在给定的延迟后运行命令,或者定期地执行命令。
ThreadPoolExecutor(int corePoolSize, //核心线程数,即使线程空闲也不回收
int maximumPoolSize, //线程数的上限
long keepAliveTime, //线程最大空闲时长
TimeUnit unit,
BlockingQueue<Runnable> workQueue, //任务的排队队列
ThreadFactory threadFactory, //新线程的产生方式
RejectedExecutionHandler handler) //拒绝策略
corePoolSize:线程池中核心线程的数量
keepAliveTime:线程空闲的时间
unit:keepAliveTime的单位
workQueue:用来保存等待执行的任务的阻塞队列,常见的阻塞队列:
threadFactory:用于设置创建线程的工厂,默认是DefaultThreadFactory
handler:RejectedExecutionHandler, 线程池的拒绝策略,分类:
如果在系统中大量使用线程池,则有必要对线程池进行监控,方便在出现问题时,可以根据线程池的使用情况快速定位问题。线程池的监控是确保线程池稳定性和性能的关键环节。以下是一些建议的监控方法和工具:
综上所述,线程池的监控是一个综合性的任务,需要结合多种方法和工具来实现。通过有效的监控,可以及时发现并解决线程池中的问题,从而确保系统的稳定性和性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。