我有一个集合 (concurrentHashMap
) 和一个应该在单独的线程中工作并返回 numOfApples
的方法:
public int getApples(String treeNum) {
int numOfApples = null;
Runnable task = () -> {concurrentHashMap.get(treeNum).getApples(); };
new Thread(task).start() ;
return numOfApples;
}
是否可以将 num of apples 从 lambda 表达式 (concurrentHashMap.get(treeNum).getApples()
) 传递给 numOfApples
变量?
最佳答案
问题不在于从 lambda 表达式返回值。它是关于从异步任务返回结果。
使用 Runnable
将无法轻松做到这一点.你应该使用 Callable
相反,引用它的 Javadoc:
A task that returns a result and may throw an exception.
考虑以下代码:
public int getApples(String treeNum) {
Callable<Integer> task = () -> concurrentHashMap.get(treeNum).getApples();
Future<Integer> future = Executors.newCachedThreadPool().submit(task);
return future.get();
}
它创建一个 Callable<Integer>
持有返回苹果数量的任务。此任务提交给 ExecutorService
(我只是在这里使用了一个缓存的线程池,你可能需要另一个)。结果包含在 Future<Integer>
中实例,其 get()
方法将阻塞,等待结果然后返回。
关于java - 如何从 lambda 表达式返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34332842/