[英]Simple Java Callback is not working
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
立即調用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
添加名稱后,我將使用CompletableFuture
鏈接打印。 您可以使用延遲Executor
而不是Timer
來引入5秒延遲。
import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
class Worker {
private List<String> names = new ArrayList<String>();
public CompletableFuture<Void> addToList(String name, Runnable callback) {
names.add("BMW");
names.add("DODGE");
Executor in5seconds = CompletableFuture.delayedExecutor(5, SECONDS);
return CompletableFuture.runAsync(() -> names.add(name), in5seconds)
.thenRun(callback::run);
}
public void printList() {
System.out.println(names);
}
}
class Boss implements Runnable {
private Worker worker = new Worker();
private CompletableFuture<Void> future;
public Boss(String carName) {
future = worker.addToList(carName, this);
}
public void run() {
worker.printList();
}
public CompletableFuture<Void> getFuture() {
return future;
}
}
public class IntroCallbacks {
public static void main(String[] args) {
Boss boss = new Boss("Mercedes");
boss.getFuture().join();
}
}
必須等到將來的isDone()
或最后join()
,否則程序將結束,並且后台守護程序線程將在發生任何有趣的事情(包括輸出)之前終止。
這段代碼將解決您的問題.. :)
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
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);
callback.callBackMethod();
}
}, 5000);
}
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 Main {
public static void main(String[] args) {
Boss b = new Boss("Mercedes");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.