如何分析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实际上做什么?