与另一个任务并行运行任务

我有以下使用FooProcessor类的Foo类。 所以我想要做的是,在运行cp1实例进程方法的同时,我想运行cp2.process()

 public class Foo { public static void main(String [] args){ FooProcessor cp1 = new FooProcessor(); FooProcessor cp2 = new FooProcessor(); cp1.process(); // in parallel process cp2.process(); } } public class FooProcessor { public void process(){ System.out.println("Processing.."); } } 

但是,我想顺序cp1,所以我希望它运行并完成,如果cp2没有完成或失败它是好的。 如果它失败了我想加入结果。 它没有返回此示例中的任何内容,但我想返回结果。

为此,应该使用TaskExecutor吗? 还是线程?

我只希望cp2与cp1并行运行。 或者如果我添加更多让我们说cp3,我希望它与cp1并行运行。

总结我实现它的方式:

  • 通过ExecutorService运行不同的进程,例如ExecutorService executor = Executors.newFixedThreadPool(nThreads);
  • 将所有任务的Futures存储在List中(由ExecutorService#submit返回)
  • 等待future1.get()完成,其中future1是与future1相关联的未来
  • 一旦get返回(cp1已完成) 取消所有其他期货,(或如果您不再需要执行程序,则shutdownNow执行程序服务)
  • 要使取消过程正常工作,你的cp2,cp3等需要实现一个中断策略,使他们尽快停止他们正在做的事情。

线程将是一个不错的选择…类似于接受新线程并启动它们的方法……

根据https://stackoverflow.com/a/2269177/454167 ,

您可以使用类似AsyncTaskExecutor [1]的东西,它返回一个Future对象。 然后,您可以等待Future知道cp2是否返回成功。

[1] http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/core/task/AsyncTaskExecutor.html#submit%28java.lang.Runnable%29

您当然可以使用简单和简单的线程
如果你知道你需要向处理器类添加更多方法,并且为了保持执行顺序而给它的给定实例 – 假设你首先运行方法foo,然后运行方法栏,并且你希望它们以异步方式运行,但保持执行顺序(第一个foo,然后是bar),我会考虑使用Active Object模式。
我建议也使用这种方法,因为对于处理器类的用户,它将隐藏实现细节。
此外,考虑提供一个装饰器 /包装器,它将为您的对象提供这种异步能力 – 这样您就可以控制哪个对象是异步运行的,哪些不是,并且您不必“污染”您的Processor类使用异步调用所需的代码。
在这种情况下使用的一个例子是 –

 AsyncProcessor ap = new AsyncProcessor(p1); ap.process(); //executed asynchronously Proccessor p2 = new Processor(); p2.process(); //executed synchronously 

另一个应用程序是使用你提到的执行程序 – 这可以通过实现一个线程池并将“执行单元”推送到它来实现。
执行单元将包含目标对象(cp1,cp2,…)和要执行的方法(当前 – 仅处理)
线程将从队列中获取“执行单元”并运行它们。
该实现类似于活动对象,但用户的“接口”是不同的,因为它使用“TaskExecutor”类为其提供“执行单元”

如果您正在编写自己的独立应用程序,那么使用线程可能是最简单的方法。 如果您在Java EE环境中,则不应创建自己的Thread对象,而应使用其他一些机制(例如发送消息并让消息侦听器处理您发送的信号)。 这是为了让Java EE容器控制资源利用率,例如线程池。

使用线程的示例:

 Thread t1 = new Thread(new Runnable() { @Override public void run() { executeSomeCodeInP1(); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { executeSomeCodeInP2(); } }); t1.start(); t2.start(); // if you want to wait for both threads to finish before moving on, // "join" the current thread t1.join(); t2.join();