Java中的队列方法?

时间:2016-04-13 01:55:57

标签: java

我希望用Java创建一个模式,我不确定如何正确完成...现在我有其他解决方案,但我想知道是否有办法完成这种模式

        MethodArray methodarray;

        public QueueSimulation(Method method){
            methodarray.add(method);
        }

        public RunSimulation(){
            methodarray.runall(); // runs all the qued methods in order
        }

我有很多不同的方法,我想排队的名字不同。

换句话说,我有一个班级,例如

Player.Moveup() Player.Attack() Player.FallOnGround() World.LightsOff()

我有许多不同的方法,但我希望能够将所有这些方法放在一个数组中并像上面的模式一样运行它们。

1 个答案:

答案 0 :(得分:1)

这看起来像你可以使用单线程ExecutorRunnableCallable s创建为匿名类的东西。 一些谷歌搜索引导我到Executors工厂,这有助于创建一个单线程执行器。

以下是一个例子:

public class MethodQueueSimulator {
    Collection<Callable<Void>> methodQueue = new LinkedList<>();
    ExecutorService executor = Executors.newSingleThreadExecutor();

    public static void main(String args[]) throws InterruptedException {

        MethodQueueSimulator simulator = new MethodQueueSimulator();

        simulator.QueueSimulation(new Callable<Void>() {
            @Override
            public Void call() throws Exception {
                System.out.println("1");
                return null;
            }
        });

        // if using java 8+, you can use lambdas instead
        simulator.QueueSimulation(() -> {
            System.out.println("2");
            return null;
        });

        simulator.QueueSimulation(() -> {
            System.out.println("3");
            return null;
        });

        System.out.println("Simulation starts");

        simulator.RunSimulation();

        System.out.println("Simulation complete");
    }

    public void QueueSimulation(Callable<Void> method){
        methodQueue.add(method);
    }

    public void RunSimulation() throws InterruptedException {
        executor.invokeAll(methodQueue);
        // must call shutdown, else process will not exit
        executor.shutdown();
    }
}

运行时输出:

Simulation starts
1
2
3
Simulation complete

如您所见,事件按顺序执行,对invokeAll的调用是阻塞,这意味着代码执行在继续之前等待任务完成,这就是&#34;模拟完成&#34;只打印在最后。当然,这个输出并不能证明这一说法,而是试一试并亲眼看看。

而不是System.out.println,您将调用所需的方法。我不知道你的方法有什么样的返回值,所以我选择了Void作为Callables的返回类型。