多线程连接&获得返回值

时间:2015-11-05 16:34:52

标签: java multithreading

我正在尝试使用线程进行多次繁重的计算。 然后,我需要在确保所有线程完成其工作后对结果做一些事情。

以下是基本代码:

    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()reponse =“fail”,似乎根本没有处理计算。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用ExecutorService,例如ScheduledThreadPoolExecutor;

 ExecutorService executor = new ScheduledThreadPoolExecutor(numOfThreads); 

numOfThreads是您希望坐在线程池中的线程数。

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

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

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)

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

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

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

例如,以下内容完全合法:

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