我有以下使用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并行运行。
答案 0 :(得分:5)
我将实现它的方式,总结:
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
future1.get()
完成,其中future1
是与cp1相关联的未来get
返回(cp1已完成)cancel所有其他未来,(或shutdownNow
执行者服务,如果您不再需要执行者)答案 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是否会返回成功。
答案 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();