OOP Multithreading

Stormy

Mitglied
Gute Nacht an alle,

mich beschäftigt ein Problem gerade: Multithreading.

Ich dachte ich hab mir schon das einfachste Versuchsbeispiel herausgepickt, aber ich irrte mich. Mein Beispiel sah so aus, dass ich einfach alle IP-Adressen in meinem home-Netz pinge um herauszufinden, welche meiner Rechner alle on sind. Kurz: Systemüberwachung meines Heimnetzes auf Verfügbarkeit.

Meine main-Klasse MultiPing erzeugt 31 Ping-Instanzen. Die Klasse Ping selber ruft im Konstruktor die eigene Run()-Methode auf. Normalerweise ist das ja schon in einem neuem Thread laufend oder lieg ich falsch mit dieser Behauptung? Der Punkt ist, dass nicht bei allen 31 IP-Adressen es gleichzeitig abgefragt wird, sondern eine nach der anderen. Das ist ärgerlich, denn 31x 3 Sekunden sind viel länger als 1x 3 Sekunden und dafür gleichzeitig 31 Pings. ==> Wie schaffe ich das?!

So, jetzt poste ich noch kurz meinen Code, schlafe unzufrieden ein und hoffe, dass morgen sich neue Erkenntnisse und Erfahrungen in meine Wissens- und Denklücken niederlassen werden durch eure Hilfe. ;)

Schlaft gut und ein Danke im Vorraus,

Stormy

btw: Gibt es hier keine Spoiler zum Code "verstecken"?!

Der Code:
Meine Klasse MultiPing (die main halt):
[JAVA=42]package main;

public class MultiPing
{
public static final String BASICIP = "192.168.178.";

public static void main(String[] args)
{
for (int i = 1; i < 32; i++)
{
new Ping(BASICIP+i);
}
}
}[/code]

Meine Klasse Ping:

[JAVA=42]package main;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Ping extends Thread
{
private String strIP;

public Ping ()
{
this("127.0.0.1");
}
public Ping (String strIP)
{
this.strIP = strIP;
this.run();
}
public void run()
{
try
{
System.out.println(this.strIP+": "+InetAddress.getByName(this.strIP).isReachable(3000));
} catch (UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}[/code]
 

Cola_Colin

Top Contributor
Um ein Threadobjekt loslaufen zu lassen, muss man Thread.start() aufrufen.
Also nicht direkt run(), sondern start(). Nur dann wird ein neuer Thread erzeugt der run() ausführt.
 

Stormy

Mitglied
Super, danke, es funktionert! Das mit start() und run() wusste ich nicht. Denke aber, dass ich es in Zukunft nicht mehr vergesse. ;)

Ein neues Problem ist aber entstanden:
Es fragt zwar alle gleichzeitig ab, aber bei jedem zweitem Durchlauf gibt er falsche Ergebnis zurück. Zum Beispiel, wenn die IP .1 und .10 zwar im Netz erreichbar sind und auch keine Firewallapp läuft, dass die dann bei meinem Code als "falsch" also als offline zurückgegeben wird. Weiß jemand woran es liegen kann?

Danke und Grüße,

Stormy
 

Stormy

Mitglied
Das ist mir schon klar, aber es muss doch auch eine saubere Methode geben um zu checken, ob ein Rechner erreichbar ist. Kann ja nicht sein, dass ich von Java aus auf Konsolenbefehle zugreifen muss. o.0

Grüße, Stormy

ps: hab da in Bezug auf Ping schon was gelesen, dass die RAW Sockets kein ICMP unterstützen...
(Socket Options in Java)

Edit#1:
mein neuer Code für die Ping-Klasse mit der rudimentären Lösung genannt "Konsolenping"
Java:
package main;

import java.io.IOException;
import java.net.UnknownHostException;

public class Ping extends Thread
{
	private String strIP;
	
	public Ping ()
	{
		this("127.0.0.1");
	}
	public Ping (String strIP)
	{
		this.strIP = strIP;
		//this.run();
		this.start();
	}
	public void run()
	{
		try
		{
			ProcessBuilder pb = new ProcessBuilder("ping", this.strIP);
			Process p = pb.start();
			p.waitFor();
			if (p.exitValue() == 0)
			{
				System.out.println(strIP + " is online!");
			}
			else
			{
				System.out.println(strIP + " is offline!");
			}
		} catch (UnknownHostException e)
		{
			e.printStackTrace();
		} catch (IOException e)
		{
			e.printStackTrace();
		} catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
}
 
Zuletzt bearbeitet:
G

Gast2

Gast
Du kannst (oder muss) noch die Anzahl der Pings festlegen ... unter Linux wird permanent gepingt - Windows nur 4x ... unter Linux kannst Du jedenfalls die Anzahl festlegen (-c 1?)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
buzzlightyeah multithreading Java Basics - Anfänger-Themen 4
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
I Threads Multithreading, Producer/Consumer, notify() Java Basics - Anfänger-Themen 6
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
P Multithreading in Java Java Basics - Anfänger-Themen 9
N Threads Read-Modify-Write Problem bei Multithreading (philosopher dining problem) Java Basics - Anfänger-Themen 5
R Threads Multithreading Java Basics - Anfänger-Themen 15
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
T Threads MultiThreading NullPointerException Java Basics - Anfänger-Themen 7
K Frage bzgl. Multithreading Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
C Multithreading, Methoden sichern Java Basics - Anfänger-Themen 5
P Hilfe bei MultiThreading; Einige Fragen. Java Basics - Anfänger-Themen 14
B Multithreading Java Basics - Anfänger-Themen 5
0din Multithreading und stop Java Basics - Anfänger-Themen 5
P Singletons und Multithreading Java Basics - Anfänger-Themen 11
U Anfängerfrage - Multithreading Java Basics - Anfänger-Themen 8
H Multithreading Java Basics - Anfänger-Themen 7
M Multithreading Java Basics - Anfänger-Themen 18
I Multithreading (Prüfungsvorbereitung) Java Basics - Anfänger-Themen 6
G UI friert bei Multithreading ein Java Basics - Anfänger-Themen 3
J Multithreading mit einer TextArea Java Basics - Anfänger-Themen 29
JFeel-x Multithreading in awt Java Basics - Anfänger-Themen 2
L NullpointerException wegen wahrscheinlichem Multithreading Java Basics - Anfänger-Themen 4
Z Multithreading Java Basics - Anfänger-Themen 2
P Multithreading Java Basics - Anfänger-Themen 22

Ähnliche Java Themen

Neue Themen


Oben