如何分析Java中的多线程开销?

如何分析Java中的多线程开销?,java,multithreading,performance,Java,Multithreading,Performance,我的程序如下所示: Executor executor = Executors.newSingleThreadExecutor(); void work1(){ while (true) { // do heavy work 1 Object data; executor.execute(() -> work2(data)); } } void work2(Object data){ // do heavy wor

我的程序如下所示:

Executor executor = Executors.newSingleThreadExecutor();

void work1(){
    while (true) {
        // do heavy work 1
        Object data;
        executor.execute(() -> work2(data));
    }
}

void work2(Object data){
    // do heavy work 2
}
我注意到当
work2
变得沉重时,它也会影响
work1
。将进程分成两个线程几乎没有任何好处

这种行为的原因是什么?我需要什么工具来发现和分析这些问题

哦,这是我的机器规格:

“while(true){}”工作速度快,但work2很重,工作速度慢。因此,等待单个线程的任务数量会无限增加。所以可用的核心内存被耗尽,虚拟内存被使用,这要慢得多。标准线程池不是为处理大量任务而设计的。正确的解决方案如下:

class WorkerThread extends Thread {
    ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
    public void run() {
        while true() {
           queue.take().run();
        }
     }
}

WorkerThread  workerThread = new WorkerThread();
workerThread.start();

void work1(){
    while (true) {
        Object data;
        // do heavy work
        workerThread.queue.put(() -> work2(data));
    }
 }
类WorkerThread扩展线程{
ArrayBlockingQueue=新的ArrayBlockingQueue(10);
公开募捐{
而true(){
queue.take().run();
}
}
}
WorkerThread WorkerThread=新WorkerThread();
workerThread.start();
无效工作1(){
while(true){
对象数据;
//干重活
workerThread.queue.put(()->work2(数据));
}
}

使用
ArrayBlockingQueue
可以减少等待任务的数量。

好吧
executor
是单线程的,因此繁重的工作可能会占用单线程可用的更多CPU。这里使用的第一个工具是代码检查。在那之后,我会尝试线程分析工具,并且只查看操作系统负载(
top
或任务管理器)。“当工作2变得繁重时,它也会影响工作1”您能提供更多关于这方面的详细信息吗,它会以什么方式影响?work1和work2实际上做什么?