簡體   English   中英

執行人的invokeAll服務

[英]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);

類型Collection>中的方法add(Callable)不適用於參數(PingTask)StoreReplicationSynchtimeManagerImpl.java

不知道在這里我需要做些什么來調用invokeAll。 希望能有所幫助。

謝謝

錯誤不在那一行。 它在:

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

您的集合是Callable的,其中當您的PingTask類實現Callable時。 將集合更改為:

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>類型,將導致編譯時錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM