2012-04-03 16 views
30

Utworzyłem fragment kodu, który pobiera adres IP (z głównej metody w innej klasie), a następnie wykonuje pętle z zakresu adresów IP, wysyłając polecenia ping do każdego z nich. Mam przedni interfejs GUI i to się zawiesiło (stąd dlaczego zrobiłem wielowątkowość.) Mój problem polega na tym, że nie mogę dłużej przyjmować adresu IP jako argumentu w moim kodzie ping jako jego wywoływania. do tego i nie może wydawać się znaleźć sposób to obejść.Czy istnieje sposób na metodę wywoływalne do podjęcia argumentów? Jeśli nie jest jakiś inny sposób, aby wykonać to, co próbuję zrobić?Czy istnieje sposób na podjęcie argumentu w metodzie wywoływalnej?

próbka mojego Kod:.

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 kiedyś tezę, że została podjęta

Odpowiedz

37

Nie można przekazać to jako argument do call(), ponieważ podpis metody nie pozwala na to.

Można jednak przekazać go jako argument konstruktora; na przykład

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

(mam poprawione kilka rażących naruszeń stylu kod !!)

Alternatywnie można:

  • Declare dopingu jako wewnętrzna klasy i mają odnosić się do final ipToPing w zakresie obejmującym lub

  • dodaj metodę setIpToPing(String ipToPing).

(ostatni pozwala DoPing obiekt do ponownego wykorzystania, ale minusem jest to, że trzeba będzie synchronizować do niego dostęp wątku bezpiecznie.)

+0

tak .... to nie będzie działać, jeśli przekazać Callable jako parametr do innej funkcji, która dociera do iteracyjne Callable w stosunku do szeregu argumentów, które zostały przekazane ... – Michael

+0

Czy jest to przeznaczone jako oświadczenie lub pytanie? Tak czy inaczej, nie mogę dowiedzieć się, co mówisz/pytasz. –

5

Podczas tworzenia dopingu klasy (powinny być captial liter w nazwie klasy), wysłać w th e adres ip w konstruktorze. Użyj tego adresu IP w metodzie wywołania.

4

Umieścić kilka (final) pól w swojej klasie doPing i konstruktor, który je inicjuje, a następnie przekazać te wartości, których chcesz użyć w call() do konstruktora doPing:

public class doPing implements Callable<String> { 
    private final String ipToPing; 

    public doPing(String ip) { 
     this.ipToPing = ip; 
    } 

    public String call() { 
     // use ipToPing 
    } 
} 
6

Dodawanie do odpowiedzi Jarle jest - w przypadku tworzenia Callable jako przykład anonimowych klasy, można użyć final pole poza anonimowych klasy do przekazywania danych do instancji:

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

trzeba defien właściwości, takich jak ipAddress i jego accessor spełnione taczki. i przekazanie jej wartości w metodzie constructor lub setter. W klasie doPing użyj właściwości 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

Nie można przekazywać argumenty do call() ponieważ podpis metoda nie pozwala na to, ale tutaj jest co najmniej jeden sposób, aby obejść ten problem przez

  1. definiując klasę abstrakcyjną, która otacza/narzędzi Callable i
  2. realizacji setter "wstrzyknięcie" wynik do call()

Zdefiniuj klasę abstrakcyjną:

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

Zdefiniować metodę, która powinna ogień wywołania zwrotnego:

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

W miejscu, w którym chcesz zadzwonić iWillFireTheCallback:

Zdefiniuj funkcję zwrotną (nawet możliwą w metodach):

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

a następnie zadzwonić iWillFireTheCallback przechodząc w callback:

iWillFireTheCallback(new MyCallback()); 
Powiązane problemy