为什么在 zookeeper WorkerSender 中使用 poll() 而不是 take()

Why use poll() instead of take() in zookeeper WorkerSender

我一直在阅读 zookeeper 源代码,发现当从 FastLeaderElection.WorkerSender 中的队列中获取 ToSend 消息时,他们使用 poll() 而不是 take()。为什么?

poll()更好吗?

搜索 git 历史,我发现它开始使用 take(),所以必须有一个原因更改为 poll()

public void run() {
  while (!stop) {
    try {
      ToSend m = sendqueue.poll(3000, TimeUnit.MILLISECONDS);
      if (m == null) {
        continue;
      }
      process(m);
    } catch (InterruptedException e) {
      break;
    }
  }
  LOG.info("WorkerSender is down");
}

TL;DR: 检查停止标志。


ZOOKEEPER-498: Diff of FastLeaderElection.java

所做的更改

旧代码:

class WorkerReceiver implements Runnable {

    QuorumCnxManager manager;

    WorkerReceiver(QuorumCnxManager manager) {
        this.manager = manager;
    }

    public void run() {

        Message response;
        while (true) {
            // Sleeps on receive
            try{
                response = manager.recvQueue.take();

                // Receive new message
                LOG.debug("Receive new message.");

新代码:

class WorkerReceiver implements Runnable {
    volatile boolean stop;
    QuorumCnxManager manager;

    WorkerReceiver(QuorumCnxManager manager) {
        this.stop = false;
        this.manager = manager;
    }

    public void run() {

        Message response;
        while (!stop) {
            // Sleeps on receive
            try{
                response = manager.recvQueue.poll(3000, TimeUnit.MILLISECONDS);
                if(response == null) continue;

                // Receive new message
                LOG.debug("Receive new message.");

they use poll() instead of take(). Why ?

因此他们可以每 3 秒检查一次 stop 标志