Usted realmente desea utilizar un ExecutorService en lugar de hilos individuales, es mucho más limpio, probablemente con más prestaciones y le permitirá para cambiar las cosas con más facilidad posteriormente (el número de hilos de rosca, nombres, etc.):
ExecutorService pool = Executors.newFixedThreadPool(10);
for (String name : fileNames) {
pool.submit(new DownloadTask(name, toPath));
}
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
// all tasks have now finished (unless an exception is thrown above)
Y en algún otro lugar en su clase de definir el caballo de batalla real DownloadTask
:
private static class DownloadTask implements Runnable {
private String name;
private final String toPath;
public DownloadTask(String name, String toPath) {
this.name = name;
this.toPath = toPath;
}
@Override
public void run() {
// surround with try-catch if downloadFile() throws something
downloadFile(name, toPath);
}
}
El método shutdown()
tiene un nombre muy confuso, ya que "permitirá que las tareas presentadas anteriormente a ejecutar antes de terminar". awaitTermination()
declara un InterruptedException
que necesita manejar.
Esto requiere que el método 'downloadFile()' se defina dentro de 'DownloadTask' (mi recomendación) o que se declare' static' cuando esté fuera. –
'@Philipp Reichart' No se aceptarán nuevas tareas de descarga en la agrupación después de activar' shutdown'; lo evitaré si fuera usted. – Bitmap
No es un problema ya que no se agregan nuevas tareas al grupo después de que se ha cerrado en este caso. Se supone que el primer fragmento de código vive en un método y crea un nuevo grupo en cada invocación. –