Ich bin auf der Suche nach einer einfachen Möglichkeit, mehrere Aufgaben parallel zu starten und warten auf alle von ihnen abzuschließen.Kotlin/anko mehrere asynchrone Aufgaben
Betrachten Sie diese C# Beispiel:
private static void Main(string[] args)
{
var urlList = new[] {"http://www.microsoft.com/", "http://www.google.com/", "http://www.apple.com/" };
var result = GetHtml(urlList);
}
private static List<string> GetHtml(string[] urlList)
{
var tasks = new List<Task>();
var output = new List<string>();
foreach (var url in urlList)
{
var task = new Task(() =>
{
var html = new WebClient().DownloadString(url);
output.Add(html);
});
tasks.Add(task);
//starts task in a separate thread (doesn't block anything)
task.Start();
}
//waits for all tasks (running in parallel) to complete before exiting method
Task.WaitAll(tasks.ToArray());
return output;
}
getHTML Methode mehrere Web-Seiten parallel herunterlädt und gibt eine Liste von HTML-Strings.
Wie kann ich dies mit Kotlin/Anko erreichen?
private fun GetHtml(urlList: Array<String>): ArrayList<String> {
val tasks = ArrayList<Future<Unit>>()
val output = ArrayList<String>()
for (url in urlList) {
val task = async() {
//some java-code that downloads html from <url>, doesn't matter for now
output.add("html for $url")
}
tasks.add(task)
}
//this is NOT parallel execution
for (task in tasks) {
task.get()
}
//tasks.getall() ??
return output
}
Vielleicht gibt es einen besseren Weg, aber Sie können [einen 'ExecutorService' für' async' angeben] (https://github.com/Kotlin/anko/blob/master/doc/ADVANCED .md # asynchronous-tasks) und 'ExecutorService' hat eine [' awaitTermination'-Methode] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination (lang,% 20java.util.concurrent.TimeUnit)). – Michael
Mit Kotlin 1.1.1 können Sie einen oder mehrere Jobs "erwarten", siehe http://StackOverflow.com/a/43151714/882912 – KTCO