2017-10-12 104 views
1

我得到了可調用的ThreadPool方法。我想要在數組中找到大數目以及它發生的頻率,所以我做了一切,但它顯示錯誤。任何人都可以幫助我。謝謝。線程池可調用

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; 
    } 
} 

上面一個是我callabe()代碼和

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); 
    } 
} 

這一個是我的線程池。請給我打擾。我不能稱之爲可調用的工作納入線程池method.Please幫我

回答

0

嘗試在Java的8用這個例子與溪流,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; 
    } 
}