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]。

它应该是[BMW,DODGE,MERCEDES]。

我想念什么?

最佳答案

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之类的同步机制

10-04 19:08