Est-il possible de prendre un argument dans un callable méthode?
J'ai créé un morceau de code qui prend une adresse IP (à partir de la méthode main d'une autre classe) et puis des boucles grâce à une plage d'adresses IP ping chacun comme il va. J'ai un frontal graphique sur ce point et il a été s'écraser (c'est pourquoi j'ai fait le multithreading. Mon problème est que je ne peut plus prendre l'adresse IP comme un argument dans mon ping code comme son appelable. J'ai cherché partout pour le présent et ne peut pas sembler trouver un moyen de contourner cela. Est-il un moyen pour un callable méthode pour prendre des arguments? Si non est-il un autre moyen d'accomplir ce que je suis en train de faire?
exemple de mon code:
public class doPing implements Callable<String>{
public String call() throws Exception{
String pingOutput = null;
//gets IP address and places into new IP object
InetAddress IPAddress = InetAddress.getByName(IPtoPing);
//finds if IP is reachable or not. a timeout timer of 3000 milliseconds is set.
//Results can vary depending on permissions so cmd method of doing this has also been added as backup
boolean reachable = IPAddress.isReachable(1400);
if (reachable){
pingOutput = IPtoPing + " is reachable.\n";
}else{
//runs ping command once on the IP address in CMD
Process ping = Runtime.getRuntime().exec("ping " + IPtoPing + " -n 1 -w 300");
//reads input from command line
BufferedReader in = new BufferedReader(new InputStreamReader(ping.getInputStream()));
String line;
int lineCount = 0;
while ((line = in.readLine()) != null) {
//increase line count to find part of command prompt output that we want
lineCount++;
//when line count is 3 print result
if (lineCount == 3){
pingOutput = "Ping to " + IPtoPing + ": " + line + "\n";
}
}
}
return pingOutput;
}
}
IPtoPing utilisé pour être l'argument qui a été pris.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas le passer en argument à
call()
parce que la signature de la méthode ne permet pas à elle.Toutefois, vous pouvez passer comme un argument du constructeur; par exemple,
(J'ai corrigé quelques flagrante du code de style de violations des!!)
Alternativement, vous pouvez:
déclarer le Dopage comme un intérieur classe et ont-il référence à un
final ipToPing
dans le cadre englobant, ouajouter un
setIpToPing(String ipToPing)
méthode.(La dernière permet à un
DoPing
objet à être réutilisés, mais l'inconvénient est que vous devrez synchroniser pour accéder au thread en toute sécurité.)L'ajout de Jarle de la réponse -- dans le cas où vous créez
Callable
comme instance de la classe anonyme, vous pouvez utiliserfinal
champ à l'extérieur de la classe anonyme pour le passage des données dans l'instance:Lorsque vous créez le dopage de la classe (doit être en majuscule de la lettre dans le nom de la classe), de l'envoyer à l'adresse ip dans le constructeur. Utiliser cette adresse ip dans l'appel de méthode.
Vous ne pouvez pas passer des arguments à
call()
parce que la signature de la méthode ne permet pas à elle mais ici, c'est au moins une façon de contourner ce problème enCallable
etcall()
Définir une classe abstraite:
Définir la méthode qui doit se déclencher le rappel:
À l'endroit où vous voulez l'appeler
iWillFireTheCallback
:Définir la fonction de rappel (même possible à l'intérieur des méthodes):
Et ensuite appeler
iWillFireTheCallback
en passant dans le rappel:Mettre certains (
final
) les champs dans votredoPing
classe et un constructeur qui initialise, puis transmettre les valeurs que vous souhaitez utiliser danscall()
le constructeur dedoPing
:Vous avez à defien une propriété, par exemple
ipAddress
et sa méthode d'accesseur. et le passage de sa valeur enconstructor
ou parsetter
méthode. DansdoPing
classeipAddress
propriété.