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

时间:2012-06-27 02:46:00

标签: java multithreading threadpool executor

我有以下使用Foo类的FooProcessor类。所以我想要做的是,在运行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并行运行。

5 个答案:

答案 0 :(得分:5)

我将实现它的方式,总结:

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

答案 1 :(得分:0)

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

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



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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

根据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

答案 4 :(得分:0)

如果您正在编写自己的独立应用程序,则使用线程可能是最简单的方法。如果您在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();