2016-04-13 1 views
-1

私は今、私は他のソリューションを持っている...私は適切に達成するかどうかは確認していないJavaでパターンを作成するために探していますが、パターンJavaのキューメソッド?

 MethodArray methodarray; 

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

     public RunSimulation(){ 
      methodarray.runall(); // runs all the qued methods in order 
     } 
のこの種を達成する方法があった場合、私は思っていました

私はキューに入れたい異なる名前のメソッドがたくさんあります。すなわち

Iは

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

私は多くの異なる方法があるが、例えばクラスを有しますこれらのメソッドをすべて配列に入れて、上のパターンのようにすべて実行できるようにしたいと思います。

+0

これは、シングルスレッドのエグゼキュータが行うように見えます。また、匿名クラスまたはJava 8 lambdaを使用してRunnableインターフェイスを使用する方法を見てください。 – Roman

+0

@Roman多分、私が作成しようとしているこれらの2つの方法を達成するためにシングルスレッドエグゼキュータを使用する方法の答えとして簡単にまとめることができます。今は、悲しいことに私が望んでいないメソッドごとに別のクラスを作成する必要があるように見えますが、このパターンを実行する最良の方法であれば、それを進める必要があります。 – CodeCamper

答えて

1

これは、RunnableまたはCallableの単一スレッドのExecutorを匿名クラスとして作成するためのものです。 グーグルでは、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への呼び出しが、どの手段をブロックしていますそのコード実行はタスクが完了するのを待ってから続行されます。そのため、「シミュレーションの完了」は最後にのみ表示されます。もちろん、この出力は主張を証明するものではありませんが、試して見てください。

System.out.printlnではなく、目的のメソッドを呼び出すことができます。あなたのメソッドにどのような戻り値があるのか​​分からなかったので、Callableの戻り値の型としてVoidを選択しました。