[英]How to analyze multi-threading overhead in Java?
我的程序如下所示:
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 很重而且工作很慢。 結果,等待單線程的任務數無限增加。 所以可用核心 memory 用完,使用虛擬 memory,速度慢很多。 標准線程池不是為處理大量任務而設計的。 正確的解決方案如下:
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));
}
}
使用ArrayBlockingQueue
可以減少等待任務的數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.