简单的Java回调不起作用

Abo*_*net 0 java interface callback

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");   
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用计时器模拟网络延迟.想法是等待计时器完成(在这种情况下为5秒),然后打印arrayList.无论我对代码做什么,我总是只能获得[BMW,DODGE].

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

我错过了什么?

Mic*_*ael 5

Worker::addToListBoss::callBackMethod调度计时器后立即调用.这将打印列表,该列表目前只有2个元素.〜4.99秒后,最后一个元素被添加到列表中,但它已经被打印出来了.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

或者使用像a这样的同步机制 CountDownLatch