为什么我的线程似乎总是闲置?

时间:2016-03-30 21:00:14

标签: java multithreading

我有以下代码:

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会向我显示线程似乎没有做任何事情?

1 个答案:

答案 0 :(得分:3)

  

每秒数百条消息

Redis可以在1个线程中轻松处理每秒10K个消息。使用4个线程时,它应该在1%的忙碌之下,但是对于VisualVM而言,这可能太低而无法通过采样进行检测,而是说它一直处于驻留状态。