2017-10-12 4 views
1

J'ai été struked avec la méthode ThreadPool avec callable. Je veux trouver un grand nombre dans le tableau ainsi que la fréquence de son apparition, donc j'ai tout fait mais il montre une erreur. Est-ce que quelqu'un peut m'aider. Je vous remercie.Threadpool avec appelable

import java.util.concurrent.Callable; 
public class CallableMethod im``plements Callable<Integer>{ 

    //@SuppressWarnings("unused") 
    private int[] num; 

    public CallableMethod(int [] num){ 
     this.num = num; 
    } 

    public Integer call() throws Exception{ 

     int n = num[0]; 
     int frequency = 0; 

     for(int i=1; i< num.length; i++) 
     { 

       if(n < num[i]){ 
         n = num[i]; 
       } 
     } 

     for(int i = 1; i< num.length; i++){ 
      if (n == num[i]){ 
       frequency++; 
      } 
     } 

     //System.out.println("Largest Number is : " + num); 
     //System.out.println("frequency of occurence : " + frequency); 
     return frequency; 
    } 
} 

Au-dessus est mon callabe() code et

import java.util.concurrent.*; 
import java.util.*; 

class ThreadPoolMethod { 
    // static ExecutorService pool = Executors.newFixedThreadPool(2); 

    public static void main(String[] args) { 
     ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); 
     int number[] = { 32, 43, 145, 53, 25, 98, 54, 32, 65, 63, 145, 98, 43, 23, 25, 98, 100, 102, 105, 123, 145, 
       122, 123, 11, 12, 1, 0, 123, 145, 145 }; 
     ArrayList<Future<Integer>> future = new ArrayList<Future<Integer>>(); 
     for (int j = 0; j < number.length; j++) { 
      Future<Integer> f = pool.submit(new CallableMethod(number)); 
      future.add(f); 
     } 
     // create array to store results 
     int result[] = new int[number.length]; 
     for (int j = 0; j < result.length; j++) { 
      try { 
       Future<Integer> f = future.get(j); 
       result[j] = f.get(); 
      } catch (InterruptedException e) { 
      } catch (ExecutionException e) { 
      }; 
     } 
     System.out.println("The Large Number in array is: " + n); 
     System.out.println("The : " + frequency); 
     pool.shutdown(); 
     for(int x : result) 
      System.out.print(x); 
    } 
} 

Celui-ci est mon ThreadPool. S'il te plaît, je suis struked. Je ne peux pas appeler le travail appelable en ThreadPool method.Please me aider

Répondre

0

Essayez d'utiliser cet exemple sur Java 8, avec Streams CompletableFuture, ForkJoinPool

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.ForkJoinPool; 
import java.util.stream.Collectors; 


public class DemoController { 

    public static void main(String[] args) { 
     ForkJoinPool forkJoinPool = new ForkJoinPool(2); 
     int number[] = {32, 43, 145, 53, 25, 98, 54, 32, 65, 63, 145, 98, 43, 23, 25, 98, 100, 102, 105, 123, 145, 
       122, 123, 11, 12, 1, 0, 123, 145, 145}; 
     List<CompletableFuture<Integer>> future = new ArrayList<>(); 
     for (int j = 0; j < number.length; j++) { 
      CompletableFuture<Integer> f = CompletableFuture.supplyAsync(() -> func(number), forkJoinPool); 
      future.add(f); 
     } 
     List<Integer> result = future.stream().map(f -> { 
      try { 
       return f.get(); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     }).collect(Collectors.toList()); 
     forkJoinPool.shutdown(); 
     result.forEach(System.out::println); 
    } 

    private static Integer func(int num[]) { 
     int n = num[0]; 
     int frequency = 0; 
     for (int i = 1; i < num.length; i++) { 
      if (n < num[i]) { 
       n = num[i]; 
      } 
     } 
     for (int i = 1; i < num.length; i++) { 
      if (n == num[i]) { 
       frequency++; 
      } 
     } 
     System.out.println("Largest Number is : " + n); 
     System.out.println("frequency of occurence : " + frequency); 
     return frequency; 
    } 
}