监视并发对象
监视线程
Thread 类提供了一些可以获取线程信息的方法。其中最有用的一些方法如下。
-
getId() :
该方法返回线程的标识符。标识符是一个 long 型的正数,而且是唯一的。 - getName() :
该方法返回线程的名称。
默认情况下,其命名格式为 Thread-xxx ,不过线程名称可以在构造函数中修改,也可以使用 setName() 方法修改。 - getPriority() :
该方法返回线程的优先级。
默认情况下,所有线程的优先级都为 5,但可以使用 setPriority() 方法来更改。
优先较高的线程比优先级较低的线程更容易被优先选用。 - getState() :
该方法返回线程的状态。
它返回 Enum Thread.State 中的一个值,且其取值可以为 NEW 、 RUNNABLE 、 BLOCKED 、 WAITING 、 TIMED_WAITING 和 TERMINATED 。
可查看API 文档来了解每个状态的真实含义。 - getStackTrace() :
该方法将线程的调用栈作为一个 StackTraceElement 对象数组返回。
可以打印该数组,以了解该线程被做了哪些调用。
监视锁
ReentrantLock 类有一些方法可以帮助你获知 Lock 对象的状态。
-
getOwner() :
该方法返回一个 Thread 对象,其中含有当前加锁的线程,也就是说,该线程正在执行临界段。 - hasQueuedThreads() :
该方法返回一个布尔值,它表示是否有线程等待获取锁。 - getQueueLength() :
该方法返回一个 int 值,它表示当前等待获取锁的线程数。 - getQueuedThreads() :
该方法返回一个 Collection对象,其中含有当前等待获取锁的 Thread 对象。 - isFair() :
该方法返回一个布尔值,表示公平属性的状态。
该属性的值用于判定下一个获取锁的线程。 - isLocked() :
该方法返回一个布尔值,表示锁是否归某个线程所有。 - getHoldCount() :
该方法返回一个 int 值,该值表示当前线程获取到锁的次数。
如果当前线程并没有得到锁,则返回值为 0。
否则,对于当前没有调用相匹配的 unlock() 方法的线程,该方法将返回 lock() 方法在该线程中被调用的次数。
监视执行器
执行器框架允许你执行并发任务而无须考虑线程的创建和管理问题。
可以将任务发送给执行器。它有一个内部线程池,执行任务时可以再利用。
执行器也提供了一种机制来控制任务所消耗的资源,这样你就无须担心系统过载。
ThreadPoolExecutor 提供了一些方法,可以帮助你获知执行器的状态。
-
getActiveCount() :
该方法返回执行器中正在执行任务的线程数。 - getCompletedTaskCount() :
该方法返回执行器已经执行且已完成执行的任务数。 - getCorePoolSize() :
该方法返回核心线程数目。这一数目决定了线程池中的最小线程数。
即使执行器中没有任务运行,线程池中的线程数也不会少于该方法所返回的数目。 - getLargestPoolSize() :
该方法返回执行器线程池已经同时执行过的最大线程数。 - getMaximumPoolSize() :
该方法返回执行器线程池中同时可以存在的最大线程数。 - getPoolSize() :
该方法返回线程池中当前的线程数。 - getTaskCount() :
该方法返回已经发送给执行器的任务数,包括正在等待、运行中和已经完成的任务。 - isTerminated() :
如果调用了 shutdown() 或 shutdownNow() 方法并且执行器已完成了所有未完成任务的执行,则该方法返回 true ,否则返回 false 。 - isTerminating() :
如果调用了 shutdown() 或 shutdownNow() 方法,但是执行器仍然在执行任务,则该方法返回 true 。
监视 Fork/Join 框架
ForkJoinPool 类提供了如下方法以获取其状态。
-
getParallelism() :
该方法返回线程池确立的并行处理的预期层级。 - getPoolSize() :
该方法返回线程池中的线程数。 - getActiveThreadCount() :
该方法返回线程池中当前执行任务的线程数。 - getRunningThreadCount() :
该方法返回并不等待其子任务完成的线程的数量。 - getQueuedSubmissionCount() :
该方法返回已经提交给线程池但是尚未开始执行的任务数。 - getQueuedTaskCount() :
该方法返回线程池工作窃取队列中的任务数。 - hasQueuedSubmissions() :
如果有任务提交给线程池且尚未开始执行,则该方法返回 true ,否则返回 false 。 - getStealCount() :
该方法返回 Fork/Join 池执行工作窃取算法的次数。 - isTerminated() :
如果 Fork/Join 池完成执行,则该方法返回 true ,否则返回 false 。
监视 Phaser
用于获取 Phaser 状态的方法。
-
getArrivedParties() :
该方法返回已经完成当前阶段的已注册参与方的数量。 - getUnarrivedParties() :
该方法返回尚未完成当前阶段的已注册参与方的数量。 - getPhase() :
该方法返回当前阶段的编号。第一个阶段的编号为 0。 - getRegisteredParties() :
该方法返回 Phaser 中已注册参与方的数量。 - isTerminated() :
该方法返回一个布尔值,用于指示 Phaser 是否已经完成执行。
监视流 API
peek() 方法可以置于多个方法的流水线处理之中,用以输出与在流中执行的操作或变换相关的日志信息。