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