簡體   English   中英

簡單的Java回調無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM