2012-06-27 75 views
3

我有以下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

“我想CP1顺序” - 你的意思是你想CP1和CP2以并行方式运行,但同时停止一旦CP1已经完成了它在做什么,然后要么采取从CP2的结果,如果它已经完成过或如果不是呢? – assylias

+0

是的,但我的意思是 – DarthVader

回答

5

的方式,我会实现它,在总结:

  • 通过ExecutorService运行不同的程序,例如ExecutorService executor = Executors.newFixedThreadPool(nThreads);
  • Futures的您在List中的所有任务(由ExecutorService#提交返回)
  • 等待future1.get()完成,其中future1是未来连接到CP1
  • 一次get回报(CP1已完成)cancel所有其他期货(或shutdownNow执行人服务,如果您不需要执行任何更长)
  • 为取消过程的工作,你的CP2,CP3等需要实施一个中断政策,使他们停止他们正在做的尽快。
+0

这就是我所想的。谢谢 :) – DarthVader

0

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

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



另一个apporach是你提到的,执行使用 - 这可以通过执行一个线程池,推动“执行单元可以实现到它“。
一个执行单元将包含目标对象(cp1,cp2,...)和执行方法(当前仅为进程)
线程将从队列中取出一个“执行单元”并运行它们。
实现类似活动对象,但“接口”用户是不同的,因为它采用了“TaskExecutor接口”类,以提供其“执行单元”

+0

java是否在'jdk中有'AsyncProcessor'? – DarthVader

0

主题将是一个不错的选择的东西像接受新的线程,并开始他们的方法...

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(); 
+0

这不是我想要的 – DarthVader