我真的很喜欢在Java / Android SDK中处理线程有多么容易。最近,我开始使用Executors
。这种方法:
app.executeDiskIO(() -> {
repository.saveLocation(location);
});
在很多情况下都很好,但是当事情变得更加复杂时,它似乎有缺陷。
我正在谈论这种情况:
app.executeDiskIO(() -> {
List<Restaurant> restaurants = repository.nearestRestaurants();
app.executeNetworkIO(() -> {
for(Restaurant restaurant : restaurants) {
RestaurantMenu menu = menuProvider.downloadMenu(restaurant);
runOnUiThread(() -> {
menuView.update(menu);
});
}
});
});
上面的代码与三个单独的线程一起工作,其中每个线程需要等待上一个线程完成,然后才能执行下一个线程。上面的方法有效,但是问题是diskIO
线程被阻塞,直到networkIO
和UI
线程也完成为止。。
我不太喜欢“嵌套”线程的想法。我确信必须有某种方法可以使线程以非阻塞方式互相等待。如果适用,请随时引导我学习材料。 :-)
PS:我能够解决上面的问题,但是我知道的方法比创建“嵌套”线程所需的几行代码复杂得多。我的问题是是否有一些简单而优雅的方法来解决问题。