Есть ли способ принять аргумент в вызываемом методе?
Я создал фрагмент кода, который принимает IP-адрес (из основного метода в другом классе), а затем циклически проходит через ряд IP-адресов, которые пингоруют каждый из них по мере его появления. У меня есть интерфейс GUI на этом, и он сбой (следовательно, почему я сделал многопоточность. Моя проблема в том, что я больше не могу принимать IP-адрес в качестве аргумента в своем пинговом коде как его вызываемый. для этого и не может найти способ обойти это. Есть ли способ для вызываемого метода принимать аргументы? Если нет, есть ли другой способ выполнить то, что я пытаюсь сделать?
образец моего кода:
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 использовался как аргумент, который был сделан.
Ответы
Ответ 1
Вы не можете передать его как аргумент call()
, потому что подпись метода не позволяет его.
Однако вы можете передать его как аргумент конструктора; например.
public class DoPing implements Callable<String>{
private final String ipToPing;
public DoPing(String ipToPing) {
this.ipToPing = ipToPing;
}
public String call() throws SomeException {
InetAddress ipAddress = InetAddress.getByName(ipToPing);
....
}
}
(Я исправил несколько вопиющих нарушений стиля кода!)
В качестве альтернативы вы можете:
(Последний позволяет повторно использовать объект DoPing
, но недостатком является то, что вам нужно будет синхронизировать его, чтобы получить доступ к нему поточно.)
Ответ 2
Добавление в ответ Jarle - если вы создаете Callable
как экземпляр анонимного класса, вы можете использовать поле final
вне анонимного класса для передачи данных в экземпляр:
final int arg = 64;
executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
return arg * 2;
}
});
Ответ 3
Когда вы создаете класс doPing (должен быть заголовок в имени класса), отправьте ip-адрес в конструкторе. Используйте этот ip-адрес в методе вызова.
Ответ 4
Поместите некоторые (final
) поля в класс doPing
и конструктор, который их инициализирует, затем передайте значения, которые вы хотите использовать в call()
, в конструктор doPing
:
public class doPing implements Callable<String> {
private final String ipToPing;
public doPing(String ip) {
this.ipToPing = ip;
}
public String call() {
// use ipToPing
}
}
Ответ 5
Вы не можете передавать аргументы в call()
, потому что подпись метода не позволяет этого, но здесь есть хотя бы один способ обойти это с помощью
- определение абстрактного класса, который обертывает/реализует
Callable
и
- реализация сеттера для "ввода" результата в
call()
Определить абстрактный класс:
import java.util.concurrent.Callable;
public abstract class Callback<T> implements Callable<Void> {
T result;
void setResult (T result) {
this.result = result;
}
public abstract Void call ();
}
Определите метод, который должен срабатывать обратный вызов:
public void iWillFireTheCallback (Callback callback) {
// You could also specify the signature like so:
// Callback<Type of result> callback
// make some information ("the result")
// available to the callback function:
callback.setResult("Some result");
// fire the callback:
callback.call();
}
В том месте, где вы хотите вызвать iWillFireTheCallback
:
Определите функцию обратного вызова (даже возможные внутренние методы):
class MyCallback extends Callback {
@Override
public Void call () {
// this is the actual callback function
// the result variable is available right away:
Log.d("Callback", "The result is: " + result);
return null;
}
}
И затем вызовите iWillFireTheCallback
при передаче в обратном вызове:
iWillFireTheCallback(new MyCallback());
Ответ 6
Вы должны определить свойство, такое как ipAddress
и его метод доступа. и передавая его значение в constructor
или методом setter
. В классе doPing
используйте свойство ipAddress
.
class DoPing/* In java all classes start with capital letter */implements Callable<String>
{
private String ipAddress;
public String getIpAddress()
{
return ipAddress;
}
public void setIpAddress(String ipAddress)
{
this.ipAddress = ipAddress;
}
/*
* Counstructor
*/
public DoPing(String ipAddress )
{
this.ipAddress = ipAddress;
}
@Override
public String call() throws Exception
{
// your logic
}
}