2017-04-05 64 views
0

我想要做這樣的事情:runnableFuture設置結果

在線程1

Future<String> future = socketService.registerRequest(uuid); 
System.out.println(future.get()); // I want to be blocked here while I will not signal from another thread 

registerRequest:

public Future<String> registerRequest(String uuid) { 
    RunnableFuture<String> runnableFuture = new FutureTask<String>(); // this code doesn't compile because it there is no default constructor 
    results.put(uuid, runnableFuture); 
    return runnableFuture; 
} 

而在另一個線程我想說這樣的水手

results.get(uuid).setResult("It is result from another thread") 

我該如何在java中實現它?

+0

我幾乎監視到你可能想要從兩個線程訪問一個'Map' ...如果是這樣,你應該從頭說明一下。如果沒有,'ExecutorService.submit'是阻止'future.get()';-)的最簡單的答案 – Roland

回答

0

如果我理解正確的話,你想要的是在一個線程,直到另一個線程被阻塞提出了一些成績。我想的BlockingQueue是很好的解決方案爲你在這裏以實例鏈接blocking queue example

0

你可以像下面這樣做,用ExecutorService

private ExecutorService executorService = Executors.newFixedThreadPool(4); 

public Future<String> registerRequest(String uuid) { 
    RunnableFuture<String> runnableFuture = new FutureTask<String>(

    Future<String> future = executorService.submit(() -> { 
     return "It is result from another thread"; 
    }); 

    // I left out the UUID part, please add yourself. 

    return future; 
} 
0

您可能希望只需撥打submitExecutorService和被罰款,如

ExecutorService yourExecutorService = /* e.g. */ Executors.newCachedThreadPool(); 
Future<String> future = yourExecutorService.submit(() -> "i am the answer created on another thread"); 

// the following line blocks, until the value is available: 
System.out.println(future.get()); 

您可能還需要尋找到Executors javadoc並按照文檔存在。

關於FutureTask:它只是一個包裝並提供兩個構造函數,一個accepting a Callable和一個Runnable。但你可能甚至不需要如前所示的包裝。