gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:05:56 25 4
gpt4 key购买 nike

编辑

我明白了:

我初始化 Service 成员的顺序很重要!其他成员(我的示例中未显示)通过调用 Service getter getTimer() 来引用 Runnable 中的 Timer >(也未显示)。在此 getter 中,监听器已注册,但尚未初始化,因为它是在其他成员之后声明/初始化的,而不是在它们之前声明/初始化的。 叹息...

<小时/>

我有一个类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
}
});
}
}

...当计时器启动时,监听器会被很好地调用。

但是,当我将滴答监听器注册为我的 Service 类的成员时,就像这样(我尝试了 public 的几种不同排列,final volatile 等):

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);
}
}

...当计时器启动时,监听器不会被调用。

我怀疑这个问题与多线程有关,因为类似的设置在跨越不同线程时工作得很好,但我对多线程不够熟悉,无法准确理解为什么这不起作用.

您能解释一下这个问题吗?

这可能与跨不同线程通过引用访问对象有关吗?还是有什么不同?

最佳答案

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

这是不正确的。我自己运行了代码,它被调用了。

这是我的代码,

package com.company;

public class Service {

private Timer timer;
Timer.TickListener tickListener = new Timer.TickListener() {
@Override
public void onTick(Timer timer) {
// this gets called perfectly fine
System.out.println(42);
}
};

Service() {
// more to follow in code snippets below where I demonstrate the issue I am facing
timer = new Timer();
timer.setTickListener(tickListener);
}

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(true) {
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);
}
try{
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

public void foo() {
timer.start();
}

public static void main(String[] args) {
Service service = new Service();
service.foo();
}
}

关于java - 多线程中的监听器仅在匿名传递时调用,而不是在声明为成员时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60069015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com