java scarica più file usando i thread

Sto cercando di scaricare più file che corrispondono a uno schema utilizzando thread. Il modello potrebbe corrispondere a 1 o 5 o 10 file di dimensioni diff.

diciamo per semplicità il codice effettivo che dovrebbe scaricare il file è nel metodo downloadFile () e fileNames è l’elenco dei nomi di file che corrispondono al modello. Come faccio a farlo usando i thread. Ogni thread scaricherà solo un file. È consigliabile creare un nuovo thread all’interno del ciclo for.

for (String name : fileNames){ downloadFile(name, toPath); } 

Vuoi veramente usare un ExecutorService invece dei singoli thread, è molto più pulito, probabilmente più performante e ti permetterà di cambiare le cose più facilmente in seguito (conteggi dei thread, nomi dei thread, ecc.):

 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) 

E da qualche altra parte della tua class definisci il cavallo di lavoro attuale 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); } } 

Il metodo shutdown() ha un nome molto confuso, perché “consentirà l’esecuzione di attività precedentemente inoltrate prima di terminare”. awaitTermination() dichiara un InterruptedException è necessario gestire.

Sì, puoi sicuramente creare una nuova discussione all’interno del ciclo. Qualcosa come questo:

 List threads = new ArrayList(); for (String name : fileNames) { Thread t = new Thread() { @Override public void run() { downloadFile(name, toPath); } }; t.start(); threads.add(t); } for (Thread t : threads) { t.join(); } // Now all files are downloaded. 

Si dovrebbe inoltre considerare l’utilizzo di un Executor , ad esempio, in un pool di thread creato da Executors.newFixedThreadPool(int) .

Sì, puoi creare le discussioni in linea.

 for (final String name : fileNames){ new Thread() { public void run() { downloadFile(name, toPath); } }.start(); } 

Usa esecutore , prova questo.

 ExecutorService exec= Executors.newCachedThreadPool() for (String name : fileNames){ exec.submit(new Runnable() { public void run() { downloadFile(name, toPath); } }); } 

Se vuoi dire tre download in esecuzione contemporaneamente, puoi usare:

 Executors.newFixedThreadPool(3) 

Tutto l’approccio sopra menzionato crea Threads ma l’effettiva Concurreny non viene raggiunta.

 ExecutorService pool = Executors.newFixedThreadPool(5); final File folder = new File("YOUR_FILES_PATH"); int l = folder.listFiles().length; System.out.println("Total Files----"+folder.listFiles().length); long timeStartFuture = Calendar.getInstance().getTimeInMillis(); pool.execute(new DownloadFile(folder,0,l/2)); pool.execute(new DownloadFile(folder,(l/2),l)); pool.shutdown(); try { pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long timeEndFuture = Calendar.getInstance().getTimeInMillis(); long timeNeededFuture = timeEndFuture - timeStartFuture; System.out.println("Parallel calculated in " + timeNeededFuture + " ms"); 

Il suddetto programma viene utilizzato per ottenere simultaneamente e si prega di modificare secondo il vostro requisito.