![](/img/trans.png)
[英]Why do my Java threads seem to run on one core only, when my machine has two?
[英]Why do my threads always seem to be idle?
我有以下代碼:
import redis.clients.jedis.JedisPubSub;
import javax.sql.DataSource;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MsgSubscriber extends JedisPubSub {
private final PersistenceService service;
private final ExecutorService pool;
public MsgSubscriber(DataSource dataSource) {
pool = Executors.newFixedThreadPool(4);
service = new PersistenceServiceImpl(dataSource);
}
public void onMessage(String channel, String message) {
pool.execute(new Handler(message, service));
}
}
它訂閱了Redis頻道,該頻道每秒接收數百條消息。
我正在處理這些消息,並將它們保存到數據存儲中,處理程序如下所示:
public class Handler implements Runnable {
private String msg;
private PersistenceService service;
public MessageHandler(String msg, PersistenceService service) {
this.msg = msg;
this.service = service;
}
@Override
public void run() {
service.save(msg);
}
}
事情似乎工作正常,消息正在寫入數據庫,但我一直在運行Java VisualVM,並且看到如下圖形:
我很擔心因為線程似乎處於這種“停放”狀態並且沒有運行 - 盡管有一些日志語句我看到代碼正在運行。 我想我的問題首先是,我的代碼是否有問題,其次,為什么Visual VM向我顯示線程似乎沒有做任何事情?
每秒數百條消息
Redis可以在1個線程中輕松處理每秒10K個消息。 對於4個線程,它應該在1%的忙碌之下,但是對於VisualVM來說,這可能太低而無法通過采樣進行檢測,而是說它一直處於停放狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.