Vectoren Threads, und Multi Operationen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo Liebe UG , Liebes Forum , Lieber Leser usw...


im Rahmen div. Projekte bin ich auf das Threading gestossen .

Und nun möchte ich eine Reihe von Operationen , die in einem Vector stehen , als Thread starten .Aber der Thread der gestartet wird , muss erst abgewartet werden bis der nächste gestartet wird.

Das sollte in meinem Falle nicht sein , da es sich um sagen wir mal Punkte, handelt, die gleichzeitig in einen Proezss geführt werden müssen.

Also meine Frage nun , wie kann ich meiner Software , ein Professionelles Multithreading Injizieren?

das Quasi alle im Vector bereitgestelleten Prozessnummern , gleichzeitig in einen aktiven Thread uebergehen und dann nach erledigun selbst wieder , diesen Thread verlassen oder ihn auflösen?
 

Oskar

Aktives Mitglied
Wenn ich das richtig versteht willst du mehrere Threads starten, wobei die Threads zeitgleich gestartet werden sollen? Korrekt?

Wenn dem so ist meine ich dich enttäuschen zu müssen. Zwar gäbe es bestimmt Möglichkeiten die Threads per Timing quasi parallel zu statrten, doch auf Maschinen ebene werden die Aufrufe wieder serialisiert (es sei denn du hast für jeden Thread einen eigenen Prozessor).

Du kannst die Threads am Besten nacheinander starten und dich auf das Scheduling der VM verlassen. Das reicht idR aus um eine ausreichende Paralellität zu erstellen.

Cheers
 
G

Guest

Gast
Danke soweit,


also die Tasks sollen Quasi zur selben Zeit starten können , und zu verschiendenen zeiten enden.

Unter Perl z.b geht das .Da wird sogar vom Betriebsystem für jeden Thraed ein neuer prozess erzeugt, und der läuft dann unter Linux mit eigenständiger PID !

Unter Java VM , wird natürlich nur eine JVM für alle Thraeds benutzt richtig?

Wichtig ist eben, man hat eine Liste mit gewissen Aktionen , die erledigt werden müssen.

Das Problem ist nur wenn der eine Task eine Latenz zeit von 1 Minute hat, wird der nächste task erst in einerMinute, also dann wenn Task 1 fertig ist , Ausgeführt.

Das geht aber nicht.

Gibt es keine Signale , die dem nächsten Task Signalisieren :



Ja , Task 1 hat begonnen und benötigt die Info von Task 2 .

Task 2 bitte starten... ?

Bissi pseudo Code...

Code:
while(alles ok) {





hole alle anstehenden  prozesse von vector X ;
int F = zähle alle anstehenden prozesse ;
// Quasi für jeden Wert im Vector x , starte jetzt , den prozess/thread y 
for (d = 0; d = f ; d++){
thraed = neuer thread(aktion);
starte den tread d;

randomZeit = generiere zeit in millisekunden;

warte bis die variabele (latenzzeit = randomzeit) ,  vorbei ist ;

kill thread ;



}



}
 
B

Beni

Gast
Ich bin mir nicht sicher, auf welcher Ebene du Informationen benötigst... sieht mir aber so aus, als würdest du einfach die Syntax nicht kennen.

In Java werden Threads so gebaut:
Code:
public class Task extends Thread{
  // Der Thread lebt solange, wie etwas in dieser Methode geschieht
  public void run(){
    // mach was....
  }
}

Und so wird ein Thread dann gestartet
Code:
public void startEinTask(){
  Task task = new Task();
  task.start();

  // hier gehts gleich weiter, während die "run"-Methode von Task ausgeführt wird
}
 

PyroPi

Aktives Mitglied
Anonymous hat gesagt.:
Das Problem ist nur wenn der eine Task eine Latenz zeit von 1 Minute hat, wird der nächste task erst in einerMinute, also dann wenn Task 1 fertig ist , Ausgeführt.

Das geht aber nicht.

Gibt es keine Signale , die dem nächsten Task Signalisieren :

Ja , Task 1 hat begonnen und benötigt die Info von Task 2 .

Task 2 bitte starten... ?

Doch, das geht! Du legst Thread I mittels wait (oder war es sleep?) schlafen und weckst ihn wenn Thread II fertig ist über notify/notifyAll. Du mußt vorher natürlich noch irgendwelche Bedingungen festlegen, die einem Thread sagen, ob er schon weitermachen kann. Könnte ja passieren, das der schlafende Thread irgendwann von woanders wach gemacht wird.
 

Mnemo

Mitglied
Vielleicht hilft folgendes ja fürs Verständnis:

Task task1 = new Task();
Task task2 = new Task();
Task task3 = new Task();
Task task4 = new Task();

task1.start();
task2.start();
task3.start();
task4.start();


Wenn du obiges in deinem Programm machst. Und z.B. jeder Task die Zahlen 1 - 100 Auf System.out ausgibt.
Könntest du folgende Varianten als Ergebnis bekommen.

Beispiel 1:
1 2 3 4...100 1 2 3...100 etc.

Wahrscheinlicher ist aber folgendes:

Beispiel 2:
1 2 4 5 1...100 etc.

Nachdem du die 4 Threads gestartet hast laufen jene schon 'quasi' parallel ab.

Es bleibt nun dem Scheduler der VM überlassen, der entscheidet, wann welcher Thread auf System.out schreibt und das ist eben unsynchronisiert also zufällig. Für ein Ergebnis wie in Beispiel 1 müßtest du mit synchronized (){} in der run()-Methode arbeiten.

Wen du Mehrere Prozessoren hast könntest du z.B. mit der VM direkt arbeiten z.B. Runtime.getRuntime().availableProcessors() etc.
 
G

Guest

Gast
Boah , lieben Dank.



Also @ PyroPi:



Doch, das geht! Du legst Thread I mittels wait (oder war es sleep?) schlafen und weckst ihn wenn Thread II fertig ist über notify/notifyAll. Du mußt vorher natürlich noch irgendwelche Bedingungen festlegen, die einem Thread sagen, ob er schon weitermachen kann. Könnte ja passieren, das der schlafende Thread irgendwann von woanders wach gemacht wird.

Genau das hab ich gemacht und der Thread wartetet bis der 1. Thread Quasi "ausgeschlafen hatte" .

Was aber so nicht sein soll.

Er soll via wait oder sleep in den Schlafmode übergehen , aber nicht , warten bis dieser fertig sondern , nach dem wait oder sleep, den nächsten Thrad starten der dann genau das selbe macht.


Also wie ein Multitasking System , das zwar sequenziell arbeitet , weil die cpu das nur so zulässt , aber trotzdem "gleichzeitig" die tasks abbarbeitet!


( Drucken und , installieren von Software z.B )

Das geht ja hier mit Notify !

aber das mit dem Notify hab ich nich ganz gerafft!

Was bedeutet das , und wie setzt man das ein?


Wenn der Thrad schlafen geht , sendet er ein Notify "wohin", und was geschieht dann genau?
 

PyroPi

Aktives Mitglied
Anonymous hat gesagt.:
Also wie ein Multitasking System , das zwar sequenziell arbeitet , weil die cpu das nur so zulässt , aber trotzdem "gleichzeitig" die tasks abbarbeitet!

Na das ist doch genau das Prinzip, nachdem die Threads arbeiten. Du startest alle Threads auf einmal und läßt sie dann quasi parallel ihre Aufgaben abarbeiten.

Anonymous hat gesagt.:
Genau das hab ich gemacht und der Thread wartetet bis der 1. Thread Quasi "ausgeschlafen hatte" .

Was aber so nicht sein soll.

Er soll via wait oder sleep in den Schlafmode übergehen , aber nicht , warten bis dieser fertig sondern , nach dem wait oder sleep, den nächsten Thrad starten der dann genau das selbe macht.

Das klingt jetzt so, als würdest du wollen, daß sich die Threads der Reihe nach gegenseitig starten. Dann mußt du aber aufpassen: Wenn sich ein Thread schlafen legt und danach erst einen anderen Thread startet, dann passiert das ja nicht, weil sich der Thread gerade schlafen gelegt hat. Vielleicht wird er irgendwann mal wieder geweckt und startet dann erst (als nächste Anweisung) den anderen Thread. Du müßtest also erst den anderen Thread starten und den ersten danach schlafen legen.

Anonymous hat gesagt.:
Das geht ja hier mit Notify !

aber das mit dem Notify hab ich nich ganz gerafft!

Was bedeutet das , und wie setzt man das ein?

Wenn der Thrad schlafen geht , sendet er ein Notify "wohin", und was geschieht dann genau?

Nein, er sendet nicht notify. Notify rufst du auf dem selben Objekt auf, auf dem du einen Thread schlafen gelegt hast. Dann sucht sich der Scheduler (zufällig) einen Prozess in der Warteschlange, der als nächster an die Reihe kommt. Das entspricht also einem wakeup. NotifyAll weckt einfach alle schlafenden Prozesse in der Warteschlange.
 
G

Guest

Gast
Ah , und das meinst du funktioniert das man erst den einen thread schlafen legen sollte wenn der 2 gestartet ist.

Hmm klingt gut , aber ohne es jetzt auszuprobieren, denk ich mir bei meinen vorherigen versuchen eine solche Sache zu Programmieren , schlug es immer fehl das der 1 prozess schlafen ging , und der andere erst dann gestatet wurde , wenn der erste ausgeschlafen hatte (oder wach bzw. finish ist);


nun wuerde das sich ja lediglich um einen thread verschieben, naemlich das beim 2 thread der 3 erst dann ausgefuehrt wird wenn der 2. ferti geschlafen hat...

oder ?
 
G

Guest

Gast
OK vielleicht erklär ichs immer zu, Falsch.




Code:
public void doit extends Thread {



System.out.println("Thraed gestartet" );

sleep(2000);
System.out.println("Thraed beendet" );

}


Thread task1 = new Thread(doit);
Thread task2 = new Thread(doit);
Thread task3 = new Thread(doit);

task1.start();
task2.start();
task3.start();

}



So auf der Maschien steht jetzt :
Thraed gestartet ... thread beendet Thraed gestartet ... Thread beendet


Ich möchte aber das da steht
Thread gestartet Thread gestartet Thread gestartet .... Thread beendet usw..


Wie genau macht man das?
 
B

Beni

Gast
Wenn ich sowas mache:
Code:
public class Test implements Runnable{
	public static void main(String[] args) {
		new Thread( new Test() ).start();
		new Thread( new Test() ).start();
		new Thread( new Test() ).start();
		new Thread( new Test() ).start();
	}
	
	public void run() {
		for( int i = 0; i < 100; i++ ){
			System.out.println( i );
			try {
				Thread.sleep( (int)(Math.random() * 1000) );
			} catch (InterruptedException e) {
				return;
			}
		}
	}
}

... kommt als Ausgabe etwas wie
Code:
0
0
0
0
1
2
1
3
1
1
4
2
2
2
3
5
4
3
5
3
4
5
6
4
5
6
6
6
7
8
7
7
9
7
8
8
8
10

Und dieses Verhalten willst du? Die asynchronen Effekte tretten nicht immer sofort auf, es benötigt ein bisschen Zeit damit die Threads durcheinander gemischt werden.
 

Illuvatar

Top Contributor
Oder um mal genau dein Beispiel aufzugreifen:

Code:
public class ThreadTest
{
  public static void main(String[] args)
  {
    Thread t1 = new Doit();
    Thread t2 = new Doit();
    Thread t3 = new Doit();
    
    t1.start();
    t2.start();
    t3.start();
  }
}
class Doit extends Thread
{
  public void run()
  {
    System.out.println("Gestartet");
    try{
      Thread.sleep(2000);
    }catch (Exception e){
      //Should never happen
      e.printStackTrace();
    }
    System.out.println("Beendet");
  }
}
gibt bei mir aus:
Gestartet
Gestartet
Gestartet
Beendet
Beendet
Beendet
 
G

Guest

Gast
Wie wäre es mit yield()?
Code:
public class Test implements Runnable{
   public static void main(String[] args) {
      new Thread( new Test() ).start();
      new Thread( new Test() ).start();
      new Thread( new Test() ).start();
      new Thread( new Test() ).start();
   }

   public void run() {
      for( int i = 0; i < 100; i++ ){
         System.out.println( i );
         Thread.currentThread().yield(); // Kontrolle an den nächsten Thread übergeben
      }
   } 
}
Die einzelnen Threads laufen dann quasi parallel.
 

Dominicana

Aktives Mitglied
Gibt es die Möglichkeit , das ganze auch in einem Applet zu realisieren???

Beispielsweise einen Musiktitel abspielen und die dazugehörenden Infos mittels drawString("xyz", x , y) im Applet scrollen lassen.

Dom.
 

byte

Top Contributor
Anonymous hat gesagt.:
Code:
public void doit extends Thread {



System.out.println("Thraed gestartet" );

sleep(2000);
System.out.println("Thraed beendet" );

}


Thread task1 = new Thread(doit);
Thread task2 = new Thread(doit);
Thread task3 = new Thread(doit);

task1.start();
task2.start();
task3.start();

}



So auf der Maschien steht jetzt :
Thraed gestartet ... thread beendet Thraed gestartet ... Thread beendet


Ich möchte aber das da steht
Thread gestartet Thread gestartet Thread gestartet .... Thread beendet usw..


Wie genau macht man das?

Poste doch mal den genauen Code. Der oben kann ja so nicht richtig sein. ;)

Irgendwie vermute ich, dass Du den Unterschied zwischen Thread und Task (Runnable) nicht kennst. Denn die Ausgabe lässt eher vermuten, dass Du die Tasks im selben Thread aufrufst.
 

Leroy42

Top Contributor
Dominicana hat gesagt.:
Gibt es die Möglichkeit , das ganze auch in einem Applet zu realisieren???

Sicher!

byto hat gesagt.:
Poste doch mal den genauen Code. Der oben kann ja so nicht richtig sein. ;)

Irgendwie vermute ich, dass Du den Unterschied zwischen Thread und Task (Runnable) nicht kennst. Denn die Ausgabe lässt eher vermuten, dass Du die Tasks im selben Thread aufrufst.

Der Code der gepostet wurde, war doch sowieso nur Pseudocode.

Es wäre hilfreich wenn OP genauer beschreiben würde wann seine Threads
parallel ablaufen dürfen/sollen und wann sie aufeinander warten müssen.

Ich denke schon daß es hinzubekommen ist; die Frage ist nur, was es eigentlich ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
G Kleine Frage zu Vectoren Allgemeine Java-Themen 2
W n Vectoren mit Vectoren füllen Allgemeine Java-Themen 11
P Array von Vectoren + Generics Allgemeine Java-Themen 6
N warning bei Vectoren Allgemeine Java-Themen 15
C Vectoren befuellen sich von selbst Allgemeine Java-Themen 2
meez Vectoren vs. "richtige" Arrays Allgemeine Java-Themen 18
E Sortieren von Vectoren Allgemeine Java-Themen 5
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
x46 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
P 4 Threads in einer Methode Allgemeine Java-Themen 2
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
OnDemand Threads und synchronized Allgemeine Java-Themen 9
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
OnDemand Threads und synvhronized Allgemeine Java-Themen 2
S Problem mit Threads Allgemeine Java-Themen 1
W Threads Threads warten lassen Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
M Threads Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
O Threads und If Befehle Allgemeine Java-Themen 7
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
C Threads und Exceptions Allgemeine Java-Themen 7
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
E Threads Sudoku Threads Allgemeine Java-Themen 8
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
Gossi Threads mit unterschiedlichen Aufgaben in einer Klasse? Allgemeine Java-Themen 9
G Threads Ablauf von Threads im Spezialfall Allgemeine Java-Themen 4
V Threads bei quadcore Allgemeine Java-Themen 10
V 1000 Threads oder Iterativ? Allgemeine Java-Themen 11
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
B Threads Game of Life - Threads Allgemeine Java-Themen 49
R Threads Exceptions von Threads abfangen im ThreadPool Allgemeine Java-Themen 5
S Threads Ende sämtlicher Threads abwarten Allgemeine Java-Themen 6
S Frage zu Threads (Sichtbarkeit und Verhalten) Allgemeine Java-Themen 11
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
P Threads- Programming Allgemeine Java-Themen 2
G Threads Klasse Sound und Threads bleiben hängen Allgemeine Java-Themen 4
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
M Threads dauerhafte bewegung mit threads Allgemeine Java-Themen 11
frankred Threads Auf eine Gruppe von Threads warten Allgemeine Java-Themen 11
J Eure Meinung: Threads verwenden, oder nicht? Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben