执行程序服务调用全部



我对可调用接口相当陌生。我有一些代码,目前无法编译,只需要一些帮助来说明原因......

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

平任务在哪里...

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

类型为 Collection> 中的方法 add(Callable) 不适用于参数 (PingTask) StoreReplicationSynchtimeManagerImpl.java

不确定我需要在这里做什么来调用 invokeAll。将不胜感激。

谢谢

错误不在那行。它位于:

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

你的集合是可调用的,因为你的PingTask类实现了可调用的。将集合更改为:

Collection<Callable<String>>

这是你的错误:

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

PingTask实现Callable<String>,而不是Callable<PingTask>。您需要将列表声明为 Collection<PingTask>Collection<Callable<String>>

存在类型不匹配。

 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>类型,将导致编译时错误

相关内容

  • 没有找到相关文章

最新更新