2015-11-05 20 views
0

我正在尝试使用线程进行多重计算。 然后,我需要确保所有线程都完成其工作后,对结果进行一些操作。多线程加入并获取返回值

这里的基本代码:

private class Runner implements Runnable { 
     private String _result = "fail"; 

     public String get_results() { 
     return _result; 
     } 

     public void run() { 
     _result = "do complex calculation"; 
     } 
    } 

    public void test() { 
     List<Thread> threads = new ArrayList<Thread>(); 
     List<Runner> threadObjects = new ArrayList<Runner>(); 

     for (int i = 0; i < 10; i++) { 
      Runner runner = new Runner(); 
      Thread t = new Thread(runner); 
      t.start(); 
      threads.add(t); 
      threadObjects.add(runner);     
     } 

     for (Thread thread : threads) { 
      try { 
       thread.join(); 
      } catch (InterruptedException ex) { 
      } 
     } 

     for (Runner threadObject : threadObjects) { 
      System.out.println(threadObject.get_results()); 
     } 

    }  

我的问题是,在上面的代码中常见的还是不错的方法来获得计算的价值? 如果不是,请提出更好的建议。 也有时我得到了runner.get_results()回应=“失败”,似乎计算根本没有处理。

感谢

+3

_Also有时我得到亚军.get_results()reponse =“fail”_这不应该与您发布的代码一致。 –

+3

取决于一点,但寻找'未来'和'执行者'。常见的做法是,你很少看不到直接使用的'Thread'类。 – zapl

+0

您不应该从此代码获取'=“失败”',因为您在创建的每个线程上都调用了'.join()'。 – 3kings

回答

1

您可以使用ExecutorServiceScheduledThreadPoolExecutor;

ExecutorService executor = new ScheduledThreadPoolExecutor(numOfThreads); 

numOfThreads是你想要坐在线程池中的线程数。

然后,您可以使用ScheduledThreadPoolExecutor类提供的submit(Callable<T> task)方法执行计算。

然后,您将有一个Callable执行您的计算,并将其传递给ExecutorService中的submit()方法执行计算;

class Calculation implements Callable { 

    @Override 
    public Object call() throws Exception { // The signature can be changed to return a different type (explained at the end) 
     return "do complex calculation"; 
    } 
} 

我们可以从submit(Callable<T> task)方法返回一个Future的方法签名看。

public <T> Future<T> submit(Callable<T> task) 

Future类的get()方法将返回成功完成后的结果。这可以确保您的计算在阅读之前完成。

关于call()方法返回类型的进一步说明;

虽然这个返回Object没有什么能阻止你改变对象返回的类型(这被称为co-variant returns

例如,以下是完全合法:

@Override 
    public String call() throws Exception { 
     return "do complex calculation"; 
    } 
+0

你能提供简单的完整的java代码示例吗? – Ratha