2012-04-03 2 views
30

Я создал кусок кода, который принимает 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 раньше аргумент, что было принято

ответ

37

Вы не можете пройти это как аргумент 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); 
     .... 
    } 
} 

(я исправил несколько вопиющих нарушений кода стиля !!)

В качестве альтернативы, вы можете:

  • объявлять ДОПИНГ как внутренний класс и он относятся к final ipToPing в прилагаемом объеме, или

  • Добавить метод setIpToPing(String ipToPing).

(Последнее позволяет DoPing объект для повторного использования, но недостатком является то, что вам нужно будет синхронизировать доступ к нему потоков безопасно.)

+0

так .... это не будет работать, если вы передаете Callable в качестве параметра другой функции, которая пытается перебирать отзывной против массива аргументов он был принят ... – Michael

+0

Является ли это заговор или вопрос? В любом случае, я не могу понять, что вы заявляете/спрашиваете. –

5

при создании ДОПИНГ-класса (должно быть Captial буква в имени класса), отправить в го e ip-address в конструкторе. Используйте этот 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 
    } 
} 
6

Добавление ответа Jarle в - в случае, если вы создаете Callable в качестве экземпляра анонимного класса, вы можете использовать final поле за пределами анонимного класса для передачи данных в экземпляр:

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

вы должны defien такого свойства, как 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 
    } 
} 
2

Вы не можете передать аргументы call(), так как метод подписи не позволяет, но здесь, по крайней мере один способ обойти этот

  1. определении абстрактного класса, который оборачивает/инвентарь Callable и
  2. реализации сеттер в "впрыснуть" результат в 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());