多线程中的侦听器仅在匿名传递时才调用,而在声明为成员时不调用

问题描述 投票:0回答:1

我有一个类Service和一个内部类Timer,它们在单独的线程中运行。该计时器接受一个滴答侦听器,该滴答侦听器在计时器运行时以固定的间隔被调用。]

要旨是:

public class Service {

  private Timer timer;

  Service() {
    // more to follow in code snippets below where I demonstrate the issue I am facing
  }

  private static class Timer
    implements Runnable {

    private interface TickListener {
      void onTick(Timer timer);
    }

    private TickListener tickListener;

    public void setTickListener(TickListener tickListener) {
      this.tickListener = tickListener;
    }

    public void start() {
      new Thread(this).start();
    }

    @Override
    public void run() {
      while(keepThreadRunningCondition) {
        if(tickListener != null) {
          // to verify that Timer is actually running 
          // and tickListener is not null
          // I actually log here 
          // and the log appears just fine in all cases

          tickListener.onTick(this);
        }
      }
    }
  }
}

现在,当我匿名注册滴答监听器时,就像这样:

class Service {

  private Timer timer;

  Service() {
    timer = new Timer();
    timer.setTickListener(new Timer.TickListener() {
      @Override
      void onTick(Timer timer) {
        // this gets called perfectly fine
      }
    });
  }
}

...启动计时器后,侦听器调用就好了。

但是,当我将tick侦听器注册为我的Service类的成员时,就像这样(我也尝试了publicfinalvolatile等的几个不同排列) :

class Service {

  private Timer timer;
  private Timer.TickListener timerTickListener = new Timer.TickListener() {
    @Override
    void onTick(Timer timer) {
      // this will NOT get called
    }
  };

  Service() {
    timer = new Timer();
    timer.setTickListener(timerTickListener);
  }
}

...当计时器启动时,监听器会not

被调用。

我怀疑这个问题与多线程有关,因为类似的设置在not

跨越不同的线程时就可以正常工作,但是我对多线程并不了解,无法确切地了解为什么它不起作用。

您能否阐明这个问题?

也许与在不同线程之间通过引用访问对象有关?还是有所不同?

我有一个Service类和一个内部类Timer,它们在单独的线程中运行。该计时器接受一个滴答侦听器,该滴答侦听器在计时器运行时以固定的间隔被调用。要点是...

java multithreading listener
1个回答
0
投票

您声称将TickListener注册为Service的成员变量后,不会调用onTicket。

© www.soinside.com 2019 - 2024. All rights reserved.