有没有办法在可调用的方法中获取参数?

2022-08-31 22:26:18

我创建了一段代码,它采用一个IP地址(来自另一个类中的main方法),然后循环通过一系列IP地址,在进行ping时对每个IP地址进行ping。我有一个GUI前端,它崩溃了(这就是为什么我做多线程。我的问题是,我不能再将IP地址作为ping代码中的参数作为其可调用的。我到处寻找这个,似乎找不到绕过这个问题的方法。有没有办法让可调用的方法获取参数?如果没有,有没有其他方法可以完成我想要做的事情?

我的代码示例:

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

(我已经纠正了几个令人震惊的代码样式违规行为!!)

有一些方法可以消除上面的一些“样板”编码(请参阅其他一些答案)。在本例中,我们谈论的是 4 行代码(在 ~40 行的类中),因此我不相信这是值得的。(但是,嘿,这是你的代码。

或者,您可以:

  • 将 DoPing 声明为内部类(或 lambda),并使其在封闭范围内引用 a,或者final ipToPing

  • 添加一个方法。setIpToPing(String ipToPing)

(最后一个允许重用对象,但缺点是您需要同步才能以线程安全的方式访问它。DoPing


答案 2

添加到Jarle的答案中 - 如果您创建为匿名类的实例,则可以使用匿名类外部的字段将数据传递到实例中:Callablefinal

    final int arg = 64;
    executor.submit(new Callable<Integer>() {
        public Integer call() throws Exception {
            return arg * 2;
        }
    });