我有一个集合(concurrentHashMap
)和一个方法,它应该在一个单独的线程中工作并返回numOfApples
:
public int getApples(String treeNum) {
int numOfApples = null;
Runnable task = () -> {concurrentHashMap.get(treeNum).getApples(); };
new Thread(task).start() ;
return numOfApples;
}
是否可以将lambda表达式(concurrentHashMap.get(treeNum).getApples()
)中的num个数量传递给numOfApples
变量?
答案 0 :(得分:4)
问题不在于从lambda表达式返回值。它是关于从异步任务返回结果。
您无法使用Runnable
轻松完成此操作。您应该使用Callable
来引用其Javadoc:
返回结果并可能抛出异常的任务。
请考虑以下代码:
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()
方法将阻塞,等待结果然后返回。