# Multithreading



## Kaladial (19. Sep 2007)

hi

is geht noch um meine ping geschichte... 

ich hab mir jetzt überlegt, wieso soll ich jede ip addresse nacheinander überprüfen?
ich könnte doch auch einfach 255 threads erzeugen und diese auf jeweils eine ip scannen lassen... 

das sollte doch eigentlich auch gehn... 

nur hab ich noch nie nen multithread geschrieben ... könnte mir das jemand erklären oder mal nen beispiel programm schreiben bzw posten? 

wäre supi nett

thx kala


----------



## Angel4585 (19. Sep 2007)

```
public class DeinFred extends Thread{

public DeinFred(){//Konstruktor vom Thread
}

public void run(){//hier kommt das was der Thread tun soll
//Hier am besten ne Endlosschleife die immerwieder die Aktionen wiederholt
}

}
```

Dann noch irgendwo:





```
ArrayList<DeinFred> freds = new ArrayList();

DeinFred fred = new DeinFred();
fred.start();
freds.add(fred);
```



Die IP Adresse übergibst du am besten dem Konstruktor

//Edit: Hab jetzt alles mal ungetestet eingetippt hier, also Fehler suchen falls was drin ist


----------



## Kaladial (19. Sep 2007)

```
package AVS3;

import java.io.*;
import java.net.*;
import java.io.IOException;
import java.util.ArrayList;

public class Ping4 {
	
	private static class connector extends Thread {
		
		private volatile boolean shutdown = false;
	
		public connector() {
			setName("connector");
		}
		
		public void shutdown() {
			shutdown = true;
		}
		
		public void run() {
			while(!shutdown) {
				// Attempt to complete the connection sequence
				Socket theSock = null;
				try {
					InetAddress addr = InetAddress.getByAddress(addr1);
					System.out.println(addr);			
					SocketAddress sockaddr = new InetSocketAddress(addr,port);

					theSock = new Socket();
					theSock.connect(sockaddr, timeoutMs);
				} catch (IOException ex) {
					System.out.println(ex);
				} finally {
					if (theSock != null) {
						try {
							theSock.close();
						} catch (Exception e) {System.out.println(e);}
					}
				}
			}
		}
	}
	
	public static long testConn(byte[] addr1, int port, int timeoutMs){
		long total = -1;
		ArrayList<connector> freds = new ArrayList(); 

		connector fred = new connector(); 
		fred.start(); 
		freds.add(fred); 
		
		
		return total; //returns -1 if timeout
	}
	
	public static void main( String[] args ){
		int port = 10000;
		int timeout = 5000;
		for(int i=0; i<255; i++){
			byte[] addr = new byte[]{(byte)172,(byte)16,(byte)16,(byte)i};
			System.out.println(Ping4.testConn(addr, port, timeout));
		}
	}
}
```

also so hatt ich mir das ungefähr vorgestellt... 

2 probleme:
1.) wie bekomm ich addr, port, timeout an meinen thread übergeben 
2.) wie bekomm ich nen ergeblis des threads wenn er durch is oder wenn er abgebrochen wurde`?

thx Kala


----------



## Michael... (19. Sep 2007)

Was erhoffst Du Dir von den 255 Threads? Schneller wird das ganze dadurch nicht.


----------



## Kaladial (19. Sep 2007)

hmmmm jo musste ich mittlerweile auch feststellen ... nur versteh ich es net so ganz ... 

threads sollen doch eigentlich nebeneinander ablaufen .. 
aber so wie es aussieht werden 10-15 threads gleichzeitig abgearbeitet und dann wieder 10-15 usw ... 
jut es is auf jedenfall schneller als wenn ich jeden connect nacheinander machen würd aber es dauert immer noch ca 7-10 min 255 ips zu scannen und zu gucken ob da was dran hängt...


----------



## tuxedo (19. Sep 2007)

Solange du einen 1-Kern Prozessor hast und nicht mehrere Kerne, kann dein Computer, wenn man's genau nimmt immer nur exakt eine Sache zur gleichen Zeit machen. Das "nebeneinander" geschieht nur simultan: Der Rechner schnappt sich für nen kurzen Moment den einen Thread und verarbeitet den, dann legt er ihn bei seite und nimmt den nächsten. Und das halt ganz schnell hintereinander, immer und immer wieder. 

Aber irgendwann ist halt Schluss. Bei 255 Threads wäre das System nur noch mit dem wechseln des gerade aktiven Threads beschäftigt... Das Ergebnis hast du ja gesehen: Es wird nur ein Teil der Threads "quasi-parallel" verarbeitet.

- Alex


----------



## Michael... (19. Sep 2007)

"Multithreading" heisst nicht unbedingt, das die einzelnen Threads parallel abgearbeitet werden, da ja z.B eine CPU immer nur eine Operation pro Takt durchführen kann. --> die Gesamtzeit bleibt die gleiche oder wird sogar noch grösser.
Wenn Du neben Deinem Portscan noch eine Oberfläche hast, die bedienbar sein soll, kann man die gesamte Abarbeitung der einzelnen Ports in einem eigenen Thread durchlaufen lassen.


----------



## sparrow (19. Sep 2007)

Das ist nicht ganz richtig.
Wenn ich mich recht erinnere geht bei dem Portscan sehr viel Zeit für das Warten auf Timeouts drauf.
Wartende Threads verbrauchen in der Regel aber keine Rechenzeit sonder blockieren den aktuellen Thread nur.

255 Threads auf einmal ist ein bisschen viel, aber mit einem schönen Controller kann man schon so 10 Threads gleichzeitig los schicken. Effektiv, so glaube ich, könnte man erheblich Zeit sparen.


Edit:
also rein theoretisch:

Nehmen wir an wir scannen 20 ports, 15 davon geben einen Timout:
Normaler Ablauf:
15 Timouts von 1 sek = 15 Sekunden
5 gehen direkt durch = 1 Sekunde
Also 16 Sekunden Gesamtzeit


Paraleler Ablauf:
10 Threads initialisieren: 2 Sekunden
jeder Thread wird gestartet, max. 1 Sekunde bis Timout: 1,5 Sekunden
x 2, wir haben ja 20 Ports: 1,5 Sekunden
Overhead und was sonst so anfällt: 4 Sekunden
Also gesamt 9 Sekunden



Gruß
sparrow


----------



## Kaladial (19. Sep 2007)

hmmm naja also so langsam verzweifel ich ... hab jetzt glaube die 7. variante probiert um rauszubekommen ob an der ip nen rechner sitzt oder net... alle 7 funktionieren ... aber schweine lahm ... ich bekomm echt ne krise kann doch net sein das ich 255 ips scann und dafür ca 10 -15 min brauch ... 

is echt zum heulen ... und da bin ich schon nur im c-class netzwerk... wenn ich anfang im 1 class netzwerk zu scannen brauch ich nen jahr um festzustellen ob in dem netzwerk ne cam is ...


----------



## tuxedo (19. Sep 2007)

Mir fällt da gerade noch was ein:

Du prüfst ja auf Socket-Port 10.000 ...

Was ist wenn der Zielrechner eine Firewall hat die ein DROP macht? Deine Lösung würde dann sagen: Nö, kein Rechner an dieser IP...
Um ein sicheres Ergebnis zu bekommen, müsstest du, um es weiterhin nativ in Java zu machen, wissen, auf welchem Port der jeweilige Rechner ein REJECT oder ACCEPT liefern kann.

Guckst du auch hier: http://www.java-forum.org/de/viewtopic.php?t=47888&highlight=reachable

- Alex


----------



## Kaladial (19. Sep 2007)

also da ich nur mit rechnern (kamera) komunizieren möchte die auf der 10000 auch antwortet ist das eigentlich egal was passiert wenn da was anderes passiert... 

also eigentlich brauch ich auch nur die die da antworten aber das dumme timeout behindert mich ...


----------

