void run() throws Exception {
final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final ObjectName observedName = new ObjectName("a:b=c");
final ObjectName monitorName = new ObjectName("a:type=Monitor");
mbs.registerMBean(new CounterMonitor(), monitorName);
final CounterMonitorMBean monitorProxy =
JMX.newMBeanProxy(mbs, monitorName, CounterMonitorMBean.class);
final TestMBean observedProxy =
JMX.newMBeanProxy(mbs, observedName, TestMBean.class);
final Runnable sensitiveThing = new Runnable() {
public void run() {
doSensitiveThing(monitorProxy, observedName);
}
};
final Runnable nothing = new Runnable() {
public void run() {}
};
final Runnable withinGetAttribute =
(when == When.IN_GET_ATTRIBUTE) ? sensitiveThing : nothing;
mbs.registerMBean(new Test(withinGetAttribute), observedName);
monitorProxy.addObservedObject(observedName);
monitorProxy.setObservedAttribute("Thing");
monitorProxy.setInitThreshold(100);
monitorProxy.setGranularityPeriod(10L); // 10 ms
monitorProxy.setNotify(true);
final int initGetCount = observedProxy.getGetCount();
monitorProxy.start();
System.out.println("Checking GetCount, possible deadlock if timeout.");
do { // 8038322. Until timeout of testing harness
Thread.sleep(200);
} while ((observedProxy.getGetCount()) == initGetCount);
System.out.println("Done!");
// This won't show up as a deadlock in CTRL-\ or in
// ThreadMXBean.findDeadlockedThreads(), because they don't
// see that thread A is waiting for thread B (B.join()), and
// thread B is waiting for a lock held by thread A
// Now we know the monitor has observed the initial value,
// so if we want to test notify behaviour we can trigger by
// exceeding the threshold.
if (when == When.IN_NOTIFY) {
final AtomicInteger notifCount = new AtomicInteger();
final NotificationListener listener = new NotificationListener() {
public void handleNotification(Notification n, Object h) {
Thread t = new Thread(sensitiveThing);
t.start();
try {
t.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
notifCount.incrementAndGet();
}
};
mbs.addNotificationListener(monitorName, listener, null, null);
observedProxy.setThing(1000);
System.out.println("Waiting notifCount.get() != 0, possible deadlock if timeout.");
do {
Thread.sleep(200);
} while(notifCount.get() == 0); // 8038322. Until timeout of testing harness
System.out.println("Done");
}
}
CounterMonitorDeadlockTest.java 文件源码
java
阅读 19
收藏 0
点赞 0
评论 0
项目:jdk8u-dev-jdk
作者:
评论列表
文章目录