如何使用RequestFuture等待Thread和Runnable?

时间:2017-10-17 14:29:20

标签: java android multithreading threadpool runnable

MyDataService并行收集多个GetSomeDataThread的数据。每个GetSomeDataThread都会通过RequestFutureStringRequest同步请求数据

我有超时。我通过将请求包装成另一个ThreadRunnable解决了这个问题。

超时已消失,但我现在正在异步获取数据 (请参阅call()中的评论)。

我在SO上找到了很多好的答案,但没有重复。

有什么想法吗?提前谢谢!

编辑:要澄清目标:result[0]应包含future.get()的内容,但其中包含默认值"nothing"。我可能需要等待run()完成,但不知道如何。

编辑2:我可以在StringRequest中使用call()(异步),但在未来(同步)中则不能。如果我使用StringRequest而没有将其与另一个Thread包装在一起,则应用会冻结,并且我会在一段时间后获得超时异常(网址很好)。

public class MyDataService extends Service {
    // ... 
    protected Summary summary;

    protected void loadSummary() throws Exception {
        Collection<GetSomeDataThread> threads = new ArrayList<>();

        // loop
        threads.add(new GetSomeDataThread("a"));
        threads.add(new GetSomeDataThread("b"));
        threads.add(new GetSomeDataThread("c"));

        ExecutorService executorService = Executors.newFixedThreadPool(threads.size());
        List<Future<JSONObject>> results = executorService.invokeAll(threads);
        for (Future<JSONObject> result : results) {
            // do something with the result:
            // result.get()            
        }

        executorService.shutdown();
    }
} 

-

public class GetSomeDataThread implements Callable<JSONObject> {
    // ...

    public GetSomeDataThread(String actionId) {
        // ...
        url += "&actionId=" + actionId;
    }

    @Override
    public JSONObject call() throws Exception {
        final String[] result = {"nothing"};

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                RequestFuture<String> future = RequestFuture.newFuture();
                StringRequest request = new StringRequest(Request.Method.GET, url, future, future);
                requestQueue.add(request);

                result[0] = future.get();
                Log.d(LOG_TAG, result[0]); // outputs the correct value, but delayed

                Thread.currentThread().interrupt();
            }
        });

        t.start();

        // TODO: wait for thread + runnable to finish 
        // t.join(); just blocks 

        // result[0] equals "nothing"
        return new JSONObject().put("result", result[0]); 
    }
}

0 个答案:

没有答案