簡體   English   中英

為什么我的線程似乎總是閑置?

[英]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,並且看到如下圖形:

Java Visual VM

我很擔心因為線程似乎處於這種“停放”狀態並且沒有運行 - 盡管有一些日志語句我看到代碼正在運行。 我想我的問題首先是,我的代碼是否有問題,其次,為什么Visual VM向我顯示線程似乎沒有做任何事情?

每秒數百條消息

Redis可以在1個線程中輕松處理每秒10K個消息。 對於4個線程,它應該在1%的忙碌之下,但是對於VisualVM來說,這可能太低而無法通過采樣進行檢測,而是說它一直處於停放狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM