我有一個非常奇怪的情況,我無法得到我的頭。我已經定義了一個線程池,它的用法是這樣java.util.concurrent.ExecutorService#提交需要很長時間
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
....some code.....
logger.info("Event:{}, message:[{}]", Event.MESSAGE.name(), message);
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
...some code...
}
});
logger.info("Submitted: Event:{}, message:[{}]", Event.MESSAGE.name(), message);
現在,這裏是我的日誌消息
2017-07-25 20:44:41,020 [New I/O worker #1] XXXXXXXXX.XXXXXXXServiceImpl - Event:MESSAGE, message:[{"delegateTaskId":"_5ejQ7gtTXyfh6qnPrUeJg","sync":true,"accountId":"kmpySmUISimoRrJL6NL73w"}]
2017-07-25 20:45:42,356 [New I/O worker #1] XXXXXXXXX.XXXXXXXServiceImpl - Submitted: Event:MESSAGE, message:[{"delegateTaskId":"_5ejQ7gtTXyfh6qnPrUeJg","sync":true,"accountId":"kmpySmUISimoRrJL6NL73w"}]
輸出看到這兩個消息的時間戳。雖然我期待提交到線程池的隊列應該立即,這兩條消息之間需要幾分鐘的時間。我試圖消除所有的可能性,如打印GC日誌(沒有主要的GC有暫停),加載模式等。
當我看到這個時,系統沒有負載,CPU使用量很小。它運行在亞馬遜EC2 T2LARGE框,我可以看到沒有太多的CPU使用率。
我讀了java文檔和谷歌周圍,但我找不到有用的東西。這很令人費解。任何指針,不勝感激。
------ -----編輯
我加在日誌信息的時間,以確保沒有任何記錄的問題。更新後的代碼是
logger.info("Event:{}, time:{}, message:[{}]", Event.MESSAGE.name(), new Date(), message);
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
...some code...
}
});
logger.info("Submitted: Event:{}, time:{}, message:[{}]", Event.MESSAGE.name(), new Date(), message);
這裏是輸出
Event:MESSAGE, time:Wed Jul 26 17:50:18 UTC 2017, message:[{"delegateTaskId":"pN7UzXfzSWajjJY33LbM1A","sync":true,"accountId":"kmpySmUISimoRrJL6NL73w"}]
Submitted: Event:MESSAGE, time:Wed Jul 26 17:51:19 UTC 2017, message:[{"delegateTaskId":"pN7UzXfzSWajjJY33LbM1A","sync":true,"accountId":"kmpySmUISimoRrJL6NL73w"}]
正如你可以看到,拍攝到提交任務的線程池的時間幾乎是一分鐘
時間戳由記錄器創建,它看起來像在線程本身中運行。可能會有一些同步或IO延遲。你可以在郵件中添加時間戳嗎? – Serge
從上面的描述不清楚問題的確切原因,你可以使用一個分析器,並檢查是否有任何線索。 –
上面顯示的第一條記錄的消息與線程的'run'調用中的日誌消息之間的時間增量是多少? – Adonis