2017-03-04 1 views
1
private void receive() { 
      receive = new Thread(new Runnable() { 
      public void run() { 
       while (running) { 
         byte[] data = new byte[MAX_PACKET_SIZE]; 
         DatagramPacket packet = new DatagramPacket(data, data.length); 
        try { 
         socket.receive(packet); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        String str = new String(packet.getData()); 
        System.out.println(str); 
       } 
      } 
     }, "receive"); 
     receive.start(); 
    } 

Ich brauche einen Quellport abzurufen, die so gehen würde:Wie kann ich einen Wert aus dem Bereich der Methodenebene abrufen?

packet.getPort() 

aber ich cann't herausfinden, wie ich das genau tun. Jedes Mal, wenn ich es versuche, wird der Wert auf Null gesetzt, wenn er den Gültigkeitsbereich verlässt. Er existiert also nur innerhalb der run-Methode oder sogar während der while-Schleife.

+0

Mögliches Duplikat von [Äußere Variable aus anonymer innerer Klasse setzen] (http://stackoverflow.com/questions/5977735/setting-outer-variable-from-anonymous-inner-class) – khachik

Antwort

0

Anonyme Klassen können sich nur auf final Variablen beziehen, aber solche Variablen müssen nicht immutable sein. Eine gute Wahl ist hier AtomicInteger:

final AtomicInteger port = new AtomicInteger(); 

dann in Ihrem runnable:

port.set(packet.getPort()); 

dann außen:

receive.start(); 
receive.join(); 
System.out.println(port.get()); 

Sie müssen den Anruf zu join() auch, weil start() nicht synchron ist oder deterministisch. Wenn der Wert an anderer Stelle benötigt wird, können Sie port zurückgeben/übergeben, was threadsafe ist.

Verwandte Themen