gpt4 book ai didi

java - 简单的 Java 回调不起作用

转载 作者:行者123 更新时间:2023-12-01 07:01:11 24 4
gpt4 key购买 nike

interface CallableInterface
{
void callBackMethod();
}

class Worker
{
public static ArrayList<String> names = new ArrayList<String>();
static Timer t = new Timer();

public void addToList(String newAdd, CallableInterface callback)
{
names.add("BMW");
names.add("DODGE");

t.schedule(new TimerTask() {
@Override
public void run() {
names.add(newAdd);
}
}, 5000);

callback.callBackMethod();
}

public void printList(){
System.out.println(Worker.names);
}
}


class Boss implements CallableInterface
{
Worker w1 = new Worker();

public Boss(String carName)
{
w1.addToList(carName, this);
}
public void callBackMethod()
{
w1.printList();
}
}


public class IntroCallbacks
{
public static void main(String[] args)
{
Boss b = new Boss("Mercedes");
}
}

我正在使用计时器模拟网络延迟。这个想法是等待计时器完成(在本例中为 5 秒),然后打印 arrayList。无论我对代码做什么,我总是只得到[BMW,DODGE]。

应该是[宝马、道奇、梅赛德斯]。

我错过了什么?

最佳答案

Worker::addToList 在调度计时器后立即调用 Boss::callBackMethod。这将打印列表,该列表当前只有 2 个元素。大约 4.99 秒后,最后一个元素被添加到列表中,但它已经被打印了。

如果您只想在添加第三个元素后打印列表,请将回调的调用移至添加该元素之后:

public void addToList(String newAdd, CallableInterface callback)
{
names.add("BMW");
names.add("DODGE");

t.schedule(new TimerTask() {
@Override
public void run() {
names.add(newAdd);
callback.callBackMethod();
}
}, 5000);
}

或者使用一些同步机制,例如 CountDownLatch

关于java - 简单的 Java 回调不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672412/

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