2017-05-24 101 views
1

我在这里很新很抱歉,如果我把这个问题放在一个错误的话题?Java Callable - >开始线程并等待

我的问题:

class TaskEol implements Callable<ArrayList<Coordinates>> { 
     ArrayList<CoordinatesEolEwp> coordinates = new ArrayList<Coordinates>(); 

     public ArrayList<Coordinates> call() throws Exception { 
      new Thread (() -> { 
       indicatorDatabaseAction.setVisible(true); 
       coordinates = loadCoordinatesOutOfDatabase(); 
       indicatorDatabaseAction.setVisible(false); 
      }).start(); 


      return coordinates; 
     } 
    } 

我如何等待返回之前写的对象坐标数据库?

+2

这是使用'Callable'一个非常糟糕的方式。它不应该启动一个线程,它应该被赋予一个'Executor'来处理,它返回一个包含(最终)结果的'Future'。 – Kayaman

+0

感谢您的快速回答(哇!)...你能给我一个简短的例子,如何使用它?或者我应该以完全的其他方式做到这一点?所以我希望你能看到问题。我想在一个线程中执行一些Databaseaction。 (同时会有4个DAO动作),我必须等待结果 –

回答

2

沿着这些线路,其中myCallable是你的调用,但没有Thread的东西,即

public ArrayList<Coordinates> call() throws Exception { 
    indicatorDatabaseAction.setVisible(true); 
    coordinates = loadCoordinatesOutOfDatabase(); 
    indicatorDatabaseAction.setVisible(false); 

    return coordinates; 
} 

然后...

ExecutorService e = Executors.newSingleThreadExecutor(); 
Future<ArrayList<Coordinates>> f = e.submit(myCallable); 

// Note that Future.get() blocks until results are ready 
ArrayList<Coordinates> coords = f.get(); 
+0

好的,谢谢,但是ProcessIndicator正在运行吗? –

+0

或者我应该使用完整的其他构造来做到这一点? Databas-Action正在运行时,用户应该能够使用该程序。 ProcessIndicator应该显示数据库正在加载数据 –

+1

可能。我不知道你的ProcessIndicator是什么,我只是告诉你如何正确使用'Callable'。您仍然需要以某种方式处理最终结果,可能通过轮询“Future.isDone()”或其他某种机制。 – Kayaman