考虑使用ArrayBlockingQueue
的生产者-消费者代码:我想找出a.put()
/take()
总共消耗了多少时间?b.put()
和take()
呼叫在等待中总共花费了多少时间?被阻止?
在VisualVM中拍摄快照只显示run()的深度,而不显示put()
/take()
调用。知道怎么打发这些时间吗?
一般来说,如何从main()
递归地获得所有方法的累积运行时间?
final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(QUEUE_SIZE);
ExecutorService exec = Executors.newFixedThreadPool(2);
exec.submit(new Runnable() {
int i =0;
@Override
public void run() {
while(i++<NUM)
try {
queue.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
exec.submit(new Runnable() {
int i =0;
@Override
public void run() {
while(i++<NUM)
try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
consumerFinished.countDown();
}
});
您需要更改"CPU设置",以过滤掉属于java.*
包的所有代码。检查"采样器"选项卡上的"设置",并在新预设中编辑"CPU设置"。预设在CPU设置选项卡的底部进行管理。