-
- All Superinterfaces:
-
PlatformManagedObject
- All Known Subinterfaces:
-
ThreadMXBean
public interface ThreadMXBean extends PlatformManagedObject
Java虚拟机线程系统的管理界面。Java虚拟机具有此接口的实现类的单个实例。 这种情况下实现此接口是MXBean ,可以通过调用能够得到
ManagementFactory.getThreadMXBean()方法或从platform MBeanServer方法。用于唯一标识MBeanServer中线程系统的MXBean的
ObjectName是:
可以通过调用java.lang:type=ThreadingPlatformManagedObject.getObjectName()方法获得。线程ID
线程ID是通过为线程调用Thread.getId()方法返回的正长值。 线程ID在其一生中是唯一的。 当线程被终止时,该线程ID可以被重用。该接口中的一些方法采用线程ID或线程ID数组作为输入参数,并返回每线程信息。
线程CPU时间
Java虚拟机实现可以支持测量当前线程的CPU时间,对于任何线程,或者无线程。可以使用
isThreadCpuTimeSupported()方法来确定Java虚拟机是否支持测量任何线程的CPU时间。 可以使用isCurrentThreadCpuTimeSupported()方法来确定Java虚拟机是否支持测量当前线程的CPU时间。 支持任何线程的CPU时间测量的Java虚拟机实现也将支持当前线程。该接口提供的CPU时间具有纳秒精度,但不一定是纳秒精度。
默认情况下,Java虚拟机可能会禁用CPU时间测量。
isThreadCpuTimeEnabled()和setThreadCpuTimeEnabled(boolean)方法可用于测试是否启用CPU时间测量,并分别启用/禁用此支持。 在一些Java虚拟机实现中启用线程CPU测量可能是昂贵的。线程争用监控
一些Java虚拟机可能支持线程争用监控。 当线程争用监控启用时,线程已阻止同步或等待通知的累计经过时间将被收集并返回给ThreadInfo对象。可以使用
isThreadContentionMonitoringSupported()方法来确定Java虚拟机是否支持线程争用监控。 默认情况下禁用线程争用监控。setThreadContentionMonitoringEnabled(boolean)方法可用于启用线程争用监控。同步信息和死锁检测
一些Java虚拟机可能支持监视object monitor usage和ownable synchronizer usage 。 的getThreadInfo(long[], boolean, boolean)种dumpAllThreads(boolean, boolean)方法可用于获得包括所述线程堆栈跟踪和同步信息lock一个线程被阻塞以获取或等待上并锁定线程当前拥有。ThreadMXBean接口提供了findMonitorDeadlockedThreads()和findDeadlockedThreads()方法来查找正在运行的应用程序中的死锁。- 从以下版本开始:
- 1.5
- 另请参见:
-
ManagementFactory.getPlatformMXBeans(Class), JMX Specification. , Ways to Access MXBeans
-
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 ThreadInfo[]dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)使用堆栈跟踪和同步信息返回所有实时线程的线程信息。long[]findDeadlockedThreads()查找处于死锁等待获取对象监视器的线程的周期,或 ownable synchronizers 。long[]findMonitorDeadlockedThreads()查找处于死锁等待获取对象监视器的线程的循环。long[]getAllThreadIds()返回所有活动线程ID。longgetCurrentThreadCpuTime()以纳秒为单位返回当前线程的总CPU时间。longgetCurrentThreadUserTime()返回当前线程以纳秒为单位在用户模式下执行的CPU时间。intgetDaemonThreadCount()返回当前的守护进程线程数。intgetPeakThreadCount()返回Java虚拟机启动或峰值复位后的峰值活动线程数。intgetThreadCount()返回当前线程数,包括守护进程线程和非守护程序线程数。longgetThreadCpuTime(long id)以纳秒为单位返回指定ID的线程的总CPU时间。ThreadInfogetThreadInfo(long id)返回没有堆栈跟踪的指定id的线程的线程信息。ThreadInfo[]getThreadInfo(long[] ids)返回其ID位于输入数组ids中的每个线程的线程信息,不带堆栈跟踪。ThreadInfo[]getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)返回其ID为输入数组ids每个线程的线程信息,具有堆栈跟踪和同步信息。ThreadInfo[]getThreadInfo(long[] ids, int maxDepth)返回其ID位于输入数组ids中的每个线程的线程信息,堆栈跟踪指定数量的堆栈跟踪元素。ThreadInfogetThreadInfo(long id, int maxDepth)返回指定id的线程的线程信息,堆栈跟踪指定数量的堆栈跟踪元素。longgetThreadUserTime(long id)返回指定ID的线程在用户模式下以纳秒为单位的CPU时间。longgetTotalStartedThreadCount()返回自Java虚拟机启动以来创建并启动的线程总数。booleanisCurrentThreadCpuTimeSupported()测试Java虚拟机是否支持当前线程的CPU时间测量。booleanisObjectMonitorUsageSupported()测试Java虚拟机是否支持监视对象监视器的使用情况。booleanisSynchronizerUsageSupported()测试Java虚拟机是否支持对 ownable synchronizer的使用情况进行监控。booleanisThreadContentionMonitoringEnabled()测试是否启用线程争用监控。booleanisThreadContentionMonitoringSupported()测试Java虚拟机是否支持线程争用监控。booleanisThreadCpuTimeEnabled()测试线程CPU时间测量是否启用。booleanisThreadCpuTimeSupported()测试Java虚拟机实现是否支持任何线程的CPU时间测量。voidresetPeakThreadCount()将峰值线程计数重置为当前线程数。voidsetThreadContentionMonitoringEnabled(boolean enable)启用或禁用线程争用监控。voidsetThreadCpuTimeEnabled(boolean enable)启用或禁用线程CPU时间测量。-
Methods inherited from interface java.lang.management.PlatformManagedObject
getObjectName
-
-
-
-
方法详细信息
-
getThreadCount
int getThreadCount()
返回当前线程数,包括守护进程线程和非守护程序线程数。- 结果
- 当前线程数。
-
getPeakThreadCount
int getPeakThreadCount()
返回Java虚拟机启动或峰值复位后的峰值活动线程数。- 结果
- 峰值线程数。
-
getTotalStartedThreadCount
long getTotalStartedThreadCount()
返回自Java虚拟机启动以来创建并启动的线程总数。- 结果
- 总线程数已启动。
-
getDaemonThreadCount
int getDaemonThreadCount()
返回当前的守护进程线程数。- 结果
- 当前的守护进程线程数。
-
getAllThreadIds
long[] getAllThreadIds()
返回所有活动线程ID。 返回的数组中包含的某些线程可能会在该方法返回时被终止。- 结果
-
一个
long的数组,每个都是一个线程ID。 - 异常
-
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
-
getThreadInfo
ThreadInfo getThreadInfo(long id)
返回没有堆栈跟踪的指定的id的线程的线程信息。 这个方法相当于调用:getThreadInfo(id, 0);此方法返回一个
ThreadInfo对象,该对象表示指定ID的线程的线程信息。 返回的ThreadInfo对象中的堆栈跟踪,锁定的监视器和锁定的同步器将为空。 如果给定ID的线程不存在或不存在,则此方法将返回null。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。MBeanServer访问 :
的映射类型ThreadInfo是CompositeData与作为指定属性ThreadInfo.from方法。- 参数
-
id- 线程的线程ID。 必须是积极的。 - 结果
-
一个
ThreadInfo对象,给定ID的线程没有堆栈跟踪,没有锁定的监视器,没有同步器信息;null如果给定ID的线程不存在或不存在。 - 异常
-
IllegalArgumentException- 如果是id <= 0。 -
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
-
getThreadInfo
ThreadInfo[] getThreadInfo(long[] ids)
返回其ID为输入数组ids中的每个线程的线程信息,不带堆栈跟踪。 这个方法相当于调用:getThreadInfo(ids, 0);此方法返回
ThreadInfo对象的数组。 每个ThreadInfo对象中的堆栈跟踪,锁定的监视器和锁定的同步器将为空。 如果给定ID的线程不存在或不存在,则返回的数组中的相应元素将包含null。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。MBeanServer访问 :
的映射类型ThreadInfo是CompositeData与作为指定属性ThreadInfo.from方法。- 参数
-
ids- 一个线程ID数组。 - 结果
-
一个
ThreadInfo对象的数组,每个对象包含一个线程的信息,该线程的ID位于ID的输入数组的相应元素中,没有堆栈跟踪,没有锁定的监视器,没有同步器信息。 - 异常
-
IllegalArgumentException- 如果输入阵列中的任何元素ids为<= 0。 -
SecurityException- 如果安全管理器存在,并且调用者没有ManagementPermission(“监视器”)。
-
getThreadInfo
ThreadInfo getThreadInfo(long id, int maxDepth)
返回指定的id的线程的线程信息,堆栈跟踪指定数量的堆栈跟踪元素。maxDepth参数指示要从堆栈跟踪中检索的最大数量StackTraceElement。 如果maxDepth == Integer.MAX_VALUE,线程的整个堆栈跟踪将被转储。 如果是maxDepth == 0,那么线程的堆栈跟踪不会被转储。 该方法不能获得线程锁定的监视器和锁定的同步器。当Java虚拟机具有关于一个线程或没有堆栈跟踪信息
maxDepth == 0,在堆栈跟踪ThreadInfo对象将是空数组StackTraceElement。如果给定ID的线程不存在或不存在,则此方法将返回
null。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。MBeanServer访问 :
ThreadInfo的映射类型为CompositeData,其属性在ThreadInfo.from方法中指定。- 参数
-
id- 线程的线程ID。 必须是积极的。 -
maxDepth- 要转储的堆栈跟踪中的最大条目数。 可以使用Integer.MAX_VALUE请求整个堆栈进行转储。 - 结果
-
一个
ThreadInfo的给定ID的线程,没有锁定的监视器和同步器信息。null如果给定ID的线程不存在或不存在。 - 异常
-
IllegalArgumentException- 如果是id <= 0。 -
IllegalArgumentException- 如果是maxDepth is negative。 -
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
-
getThreadInfo
ThreadInfo[] getThreadInfo(long[] ids, int maxDepth)
返回ID为输入数组ids每个线程的线程信息,堆栈跟踪指定数量的堆栈跟踪元素。maxDepth参数指示要从堆栈跟踪中检索的最大数量StackTraceElement。 如果是maxDepth == Integer.MAX_VALUE,线程的整个堆栈跟踪将被转储。 如果是maxDepth == 0,线程的堆栈跟踪不会被转储。 该方法不能获得锁定的监视器和锁定的线程的同步器。当Java虚拟机具有关于一个线程或没有堆栈跟踪信息
maxDepth == 0,在堆栈跟踪ThreadInfo对象将是空数组StackTraceElement。该方法返回一个
ThreadInfo对象的数组,每个对象是与ids数组相同索引的线程的线程信息。 如果给定ID的线程不存在或不存在,null在返回的数组的相应元素中设置null。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。MBeanServer访问 :
的映射类型ThreadInfo是CompositeData与作为指定属性ThreadInfo.from方法。- 参数
-
ids- 一个线程ID数组 -
maxDepth- 要转储的堆栈跟踪中的最大条目数。 可以使用Integer.MAX_VALUE请求整个堆栈被转储。 - 结果
-
一个
ThreadInfo对象的数组,每个对象包含一个线程的信息,该线程的ID位于ID的输入数组的相应元素中,没有锁定的监视器和同步器信息。 - 异常
-
IllegalArgumentException- 如果是maxDepth is negative。 -
IllegalArgumentException- 如果输入数组中的任何元素ids为<= 0。 -
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
-
isThreadContentionMonitoringSupported
boolean isThreadContentionMonitoringSupported()
测试Java虚拟机是否支持线程争用监控。- 结果
-
true如果Java虚拟机支持线程争用监控; 否则为false。
-
isThreadContentionMonitoringEnabled
boolean isThreadContentionMonitoringEnabled()
测试是否启用线程争用监控。- 结果
-
true如果启用线程争用监控; 否则为false。 - 异常
-
UnsupportedOperationException- 如果Java虚拟机不支持线程争用监控。 - 另请参见:
-
isThreadContentionMonitoringSupported()
-
setThreadContentionMonitoringEnabled
void setThreadContentionMonitoringEnabled(boolean enable)
启用或禁用线程争用监控。 默认情况下,线程争用监控被禁用。- 参数
-
enable-true启用;false禁用。 - 异常
-
UnsupportedOperationException- 如果Java虚拟机不支持线程争用监控。 -
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“控制”)。 - 另请参见:
-
isThreadContentionMonitoringSupported()
-
getCurrentThreadCpuTime
long getCurrentThreadCpuTime()
以纳秒为单位返回当前线程的总CPU时间。 返回的值为纳秒精度,但不一定是纳秒精度。 如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是当前线程在用户模式或系统模式下执行的时间量。这是一种方便本地管理使用的方法,相当于调用:
getThreadCpuTime(Thread.currentThread().getId());- 结果
-
如果启用了CPU时间测量,则当前线程的总CPU时间;
否则为
-1。 - 异常
-
UnsupportedOperationException- 如果Java虚拟机不支持当前线程的CPU时间测量。 - 另请参见:
-
getCurrentThreadUserTime(),isCurrentThreadCpuTimeSupported(),isThreadCpuTimeEnabled(),setThreadCpuTimeEnabled(boolean)
-
getCurrentThreadUserTime
long getCurrentThreadUserTime()
返回当前线程以纳秒为单位在用户模式下执行的CPU时间。 返回的值为纳秒精度,但不一定是纳秒精度。这是一种方便本地管理使用的方法,相当于调用:
getThreadUserTime(Thread.currentThread().getId());- 结果
-
如果启用了CPU时间测量,则当前线程的用户级CPU时间;
-1否则。 - 异常
-
UnsupportedOperationException- 如果Java虚拟机不支持当前线程的CPU时间测量。 - 另请参见:
-
getCurrentThreadCpuTime(),isCurrentThreadCpuTimeSupported(),isThreadCpuTimeEnabled(),setThreadCpuTimeEnabled(boolean)
-
getThreadCpuTime
long getThreadCpuTime(long id)
以纳秒为单位返回指定ID的线程的总CPU时间。 返回的值为纳秒精度,但不一定是纳秒精度。 如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是线程在用户模式或系统模式下执行的时间量。如果指定ID的线程不存在或不存在,则此方法返回
-1。 如果禁用CPU时间测量,此方法返回-1。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。如果在线程启动后启用CPU时间测量,则Java虚拟机实现可以选择任何时间,并将能力启用的时间包括在CPU时间测量开始的时间。
- 参数
-
id- 线程的线程ID - 结果
-
指定ID的线程的线程的总CPU时间存在,线程存活,CPU时间测量被使能;
否则为
-1。 - 异常
-
IllegalArgumentException- 如果是id <= 0。 -
UnsupportedOperationException- 如果Java虚拟机不支持其他线程的CPU时间测量。 - 另请参见:
-
getThreadUserTime(long),isThreadCpuTimeSupported(),isThreadCpuTimeEnabled(),setThreadCpuTimeEnabled(boolean)
-
getThreadUserTime
long getThreadUserTime(long id)
返回指定ID的线程在用户模式下以纳秒为单位的CPU时间。 返回的值为纳秒精度,但不一定是纳秒精度。如果指定ID的线程不存在或不存在,则此方法返回
-1。 如果禁用CPU时间测量,此方法返回-1。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。如果在线程启动后启用CPU时间测量,则Java虚拟机实现可以选择任何时间,并将能力启用的时间包括在CPU时间测量开始的时间。
- 参数
-
id- 线程的线程ID - 结果
-
用户级CPU时间为指定ID的线程,如果指定的线程存在,线程处于活动状态,并且CPU时间测量被使能;
否则为
-1。 - 异常
-
IllegalArgumentException- 如果是id <= 0。 -
UnsupportedOperationException- 如果Java虚拟机不支持其他线程的CPU时间测量。 - 另请参见:
-
getThreadCpuTime(long),isThreadCpuTimeSupported(),isThreadCpuTimeEnabled(),setThreadCpuTimeEnabled(boolean)
-
isThreadCpuTimeSupported
boolean isThreadCpuTimeSupported()
测试Java虚拟机实现是否支持任何线程的CPU时间测量。 支持任何线程的CPU时间测量的Java虚拟机实现也将支持当前线程的CPU时间测量。- 结果
-
true如果Java虚拟机支持任何线程的CPU时间测量; 否则为false。
-
isCurrentThreadCpuTimeSupported
boolean isCurrentThreadCpuTimeSupported()
测试Java虚拟机是否支持当前线程的CPU时间测量。 该方法返回true如果isThreadCpuTimeSupported()回报true。- 结果
-
true如果Java虚拟机支持当前线程的CPU时间测量; 否则为false。
-
isThreadCpuTimeEnabled
boolean isThreadCpuTimeEnabled()
测试线程CPU时间测量是否启用。- 结果
-
true如果线程CPU时间测量被使能; 否则为false。 - 异常
-
UnsupportedOperationException- 如果Java虚拟机不支持其他线程或当前线程的CPU时间测量。 - 另请参见:
-
isThreadCpuTimeSupported(),isCurrentThreadCpuTimeSupported()
-
setThreadCpuTimeEnabled
void setThreadCpuTimeEnabled(boolean enable)
启用或禁用线程CPU时间测量。 默认值取决于平台。- 参数
-
enable-true启用;false禁用。 - 异常
-
UnsupportedOperationException- 如果Java虚拟机不支持任何线程或当前线程的CPU时间测量。 -
SecurityException- 如果安全管理器存在且调用者没有ManagementPermission(“控制”)。 - 另请参见:
-
isThreadCpuTimeSupported(),isCurrentThreadCpuTimeSupported()
-
findMonitorDeadlockedThreads
long[] findMonitorDeadlockedThreads()
查找处于死锁等待获取对象监视器的线程的循环。 也就是说,在Object.wait调用之后阻止等待进入同步块或等待重新进入同步块的线程,其中每个线程拥有一个监视器,同时尝试获取另一个线程在一个周期中已经持有的另一个监视器。更正式地,如果线程是“正在等待拥有的对象监视器”的关系中的循环的一部分,则线程是监视器死锁 。 在最简单的情况下,线程A被阻塞等待线程B拥有的监视器,并且线程B被阻塞等待线程A拥有的监视器。
此方法专门用于故障排除,但不用于同步控制。 这可能是一个昂贵的操作。
此方法发现只涉及对象监视器的死锁。 要查找涉及对象监视器和ownable synchronizers的死锁,应使用
findDeadlockedThreads方法。- 结果
-
监视死锁的线程的数组(如果有的话);
否则为
null。 - 异常
-
SecurityException- 如果安全管理器存在且呼叫者没有ManagementPermission(“监视器”)。 - 另请参见:
-
findDeadlockedThreads()
-
resetPeakThreadCount
void resetPeakThreadCount()
将峰值线程计数重置为当前线程数。- 异常
-
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“控制”)。 - 另请参见:
-
getPeakThreadCount(),getThreadCount()
-
findDeadlockedThreads
long[] findDeadlockedThreads()
查找处于死锁等待获取对象监视器的线程的周期,或ownable synchronizers 。 线程就被死锁在一个循环,等待这两种类型的锁,如果每个线程拥有一个锁,同时试图获取已经由周期中的另一线程持有另一把锁。此方法专门用于故障排除,但不用于同步控制。 这可能是一个昂贵的操作。
- 结果
-
死锁的线程的数组,等待对象监视器或拥有的同步器(如果有的话);
否则为
null。 - 异常
-
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。 -
UnsupportedOperationException- 如果Java虚拟机不支持监视可用的同步器使用情况。 - 从以下版本开始:
- 1.6
- 另请参见:
-
isSynchronizerUsageSupported(),findMonitorDeadlockedThreads()
-
isObjectMonitorUsageSupported
boolean isObjectMonitorUsageSupported()
测试Java虚拟机是否支持监视对象监视器的使用情况。- 结果
-
true如果Java虚拟机支持监视对象监视器的使用情况; 否则为false。 - 从以下版本开始:
- 1.6
- 另请参见:
-
dumpAllThreads(boolean, boolean)
-
isSynchronizerUsageSupported
boolean isSynchronizerUsageSupported()
测试Java虚拟机是否支持 ownable synchronizer使用情况的监控。- 结果
-
true如果Java虚拟机支持监视自己的同步器使用情况; 否则为false。 - 从以下版本开始:
- 1.6
- 另请参见:
-
dumpAllThreads(boolean, boolean)
-
getThreadInfo
ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
返回其ID为输入数组ids每个线程的线程信息,具有堆栈跟踪和同步信息。该方法获取每个线程的线程信息的快照,包括:
- 整个堆栈跟踪,
- 如果
lockedMonitors是true,那么当前由线程锁定的对象监视器,以及 - 该ownable synchronizers线程当前锁定的,如果
lockedSynchronizers为true。
此方法返回一个
ThreadInfo对象的数组,每个对象是与ids数组相同索引的线程的线程信息。 如果给定ID的线程不存在或不存在,null在返回的数组的相应元素中设置null。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。如果一个线程没有锁定任何对象监视器,或者
lockedMonitors是false,则返回的ThreadInfo对象将具有一个空的MonitorInfo数组。 同样,如果一个线程没有锁定任何同步器,或者lockedSynchronizers是false,返回的ThreadInfo对象将有一个空的LockInfo数组。当
lockedMonitors和lockedSynchronizers参数均为false,相当于调用:getThreadInfo(ids, Integer.MAX_VALUE)此方法专门用于故障排除,但不用于同步控制。 这可能是一个昂贵的操作。
MBeanServer访问 :
的映射类型ThreadInfo是CompositeData与作为指定属性ThreadInfo.from方法。- 参数
-
ids- 一个线程ID数组。 -
lockedMonitors- 如果是true,则检索所有锁定的监视器。 -
lockedSynchronizers- 如果是true,则检索所有锁定的可同步同步器。 - 结果
-
ThreadInfo对象的数组,每个对象包含有关其ID位于ID的输入数组的相应元素中的线程的信息。 - 异常
-
SecurityException- 如果安全管理器存在,并且调用者没有ManagementPermission(“监视器”)。 -
UnsupportedOperationException-- 如果
lockedMonitors是true但Java虚拟机不支持监视object monitor usage ; 要么 - 如果
lockedSynchronizers是true但Java虚拟机不支持监视ownable synchronizer usage 。
- 如果
- 从以下版本开始:
- 1.6
- 另请参见:
-
isObjectMonitorUsageSupported(),isSynchronizerUsageSupported()
-
dumpAllThreads
ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)
使用堆栈跟踪和同步信息返回所有实时线程的线程信息。 返回的数组中包含的某些线程可能会在该方法返回时被终止。此方法返回的数组
ThreadInfo个作为指定对象getThreadInfo(long[], boolean, boolean)方法。- 参数
-
lockedMonitors- 如果是true,转储所有锁定的监视器。 -
lockedSynchronizers- 如果是true,转储所有锁定的所有同步器。 - 结果
-
一个
ThreadInfo的所有活动线程的数组。 - 异常
-
SecurityException- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。 -
UnsupportedOperationException-- 如果
lockedMonitors是true但Java虚拟机不支持监控object monitor usage ; 要么 - 如果
lockedSynchronizers是true但Java虚拟机不支持监视ownable synchronizer usage 。
- 如果
- 从以下版本开始:
- 1.6
- 另请参见:
-
isObjectMonitorUsageSupported(),isSynchronizerUsageSupported()
-
-