2016-02-09 5 views
0

Я довольно новичок в вызываемом интерфейсе. У меня есть некоторый код, который я не могу получить, чтобы скомпилировать в данный момент и просто нужна помощь о том, почему ....Executor Service invokeAll

public List<String> getNonPingableRegisters (Collection<RegisterReplicationSynchTime> nonReplicatingRegisters) throws IOException { 

    int nThreads = 15; 
    final ExecutorService es = Executors.newFixedThreadPool(nThreads); 

    Collection<Callable<PingTask>> pingTasks = new ArrayList<Callable<PingTask>>(nonReplicatingRegisters.size()); 
    for (RegisterReplicationSynchTime nonReplicatingRegister : nonReplicatingRegisters) { 
     pingTasks.add(new PingTask(nonReplicatingRegister.getRegisterName())); 
    } 

    List<Future<String>> taskResults = es.invokeAll(pingTasks); 
    List<String> results = new ArrayList<String>(); 

    for (Future<String> taskResult : taskResults) { 
     try { 
      String output = taskResult.get(); 
      if (StringUtils.isNotEmpty(output)) { 
       results.add(output); 
      } 
     } catch (InterruptedException e) { 
      // handle accordingly 
     } catch (ExecutionException e) { 
      // handle accordingly   
     } 
    } 
    return results; 
} 

Где PingTask это ...

public class PingTask implements Callable<String> { 

    private String hostname = null; 

    public PingTask(String hostname) { 
     this.hostname = hostname; 
    } 

     public String call() { 
      Socket socket = null; 
      boolean reachable = false; 
      try {       
       socket = new Socket(); 
       socket.connect(new InetSocketAddress(hostname, 139), 1000); //1 sec timeout      
       reachable = true; 
       socket.close(); 
      } catch (IOException e) { 

      } 
      finally { 
       if (socket != null) { 
        try { 
         socket.close(); 
        } catch (IOException e) { 

        } 
       } 
      }  
      return (reachable ? "" : hostname); 
     } 

    } 

Ошибка компилируемому на ...

List<Future<String>> taskResults = es.invokeAll(pingTasks); 

метод дополнения (Callable) в типе коллекции> не применяется для аргументов (PingTask) StoreReplicationSynchtimeManagerImpl.java

Не уверен, что мне нужно сделать здесь, чтобы сделать вызов invokeAll. Поблагодарили бы за помощь.

благодаря

ответ

1

Ошибка не в этой линии. Это по адресу:

pingTasks.add(new PingTask(nonReplicatingRegister.getRegisterName())); 

Ваша коллекция ГОО, где, как ваш класс PingTask реализует Callable. Измените коллекцию на:

Collection<Callable<String>> 
+0

Спасибо. Это сделало работу. – Richie

0

Вот ваша ошибка:

Collection<Callable<PingTask>> pingTasks = new ArrayList<Callable<PingTask>>(nonReplicatingRegisters.size()); 

PingTask реализует Callable<String>, не Callable<PingTask>. Вам необходимо объявить свой список как Collection<PingTask> или Collection<Callable<String>>.

+0

это вещь. Даже когда у меня есть коллекция pingTasks = new ArrayList (nonReplicatingRegisters.size()); Я все еще получаю Метод invokeAll (Collection >) в типе ExecutorService не применим для аргументов (Collection ) \t StoreReplicationSynchtimeManagerImpl.java – Richie

+0

@Richie Итак, обновите свой пост, и мы рассмотрим еще раз. – shmosel

+0

@Richie, я попробовал компиляцию (производную от) вашего кода, и единственная ошибка, которую я получаю, - это необработанное 'InterruptedException'. – shmosel

0

Существует неправильный тип.

Collection<Callable<PingTask>> pingTasks = new ArrayList<Callable<PingTask>> 

Но PingTask объявлен

public class PingTask implements Callable<String> 

Изменение коллекции в Collection<PingTask>

pingTasks.add(new PingTask(nonReplicatingRegister.getRegisterName())); 

приведет к компиляции ошибки времени из-за Callable<String> типа того

Смежные вопросы