2017-04-16 3 views
-2

J'ai une liste de fichiers et je veux mettre en œuvre multithread pour lire ces fichiers avec le nombre de cœurs de processeur (disons 4). Je suis en train de supprimer les fichiers qui ont déjà été traités comme ci-dessousJava multithread dans une liste

for (int i=0;i<4;i++){ 
    Multithread thread=new Multithread("Thread " +i,list); 
    thread.start(); 
    list.remove(0); 
} 

Cependant, je ne pense pas que ce soit le bon format. Quelqu'un peut-il m'aider à implémenter multithread dans une liste?

Répondre

0

Le multithreading peut être implémenté de plusieurs façons. La méthode la plus courante consiste à soumettre des algorithmes concurrents dans une instance ExecutorService. Par exemple, l'API du flux java 8 utilise ForkJoinPool.commonPool() pour soumettre de nouvelles tâches parallèles.

Pour implémenter un algorithme parallèle, vous devez diviser votre problème en problèmes plus petits et simultanés. Dans le cas d'une liste, vous devez diviser votre liste en n listes plus petites, n étant le niveau de parallélisme.

List list = getList(); 
ExecutorService executor = ForkJoinPool.commonPool(); 
int parallelismLevel = 8; 

// Compute the number of element that each thread will compute. 
final int elementByThread = (list.size() >= parallelism) ? (list.size()/parallelism) : 1; 

// If the number of indices to compute is less than the parallelism level, 
// reduce parallelism level to the number of indices. 
final int effectiveParallelism = (list.size() >= parallelism) ? parallelism : list.size(); 

List<Future> futures = new ArrayList<>(); 
for (int iParallelism = 0; iParallelism < effectiveParallelism; iParallelism++) { 
    // Compute sub-list indices. 
    int from = iParallelism * elementByThread; 
    int to = iParallelism == (effectiveParallelism - 1) 
      ? (list.size()) 
      : ((iParallelism + 1) * elementByThread); 

    // Process sub-list asynchronously. 
    futures.add(executor.submit(() -> processList(list.subList(from, to)))); 
} 
+0

Cela fonctionne très bien. Merci. –

+0

Merci d'accepter la réponse! – sturcotte06