[英]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.