PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Threads gleichzeitig laufen lassen mit Java


Gast
2004-09-07, 20:05:08
Hallo,
wie kann ich z.B dies gleichzeitig laufen lassen:

public void sinnfrei()
{
long i=0;
while(true)
{

System.out.println(i);
i++;
}
}

public void calculate_something(int end)
{ long first,last,tmp;

first=1;
last=1;
for(int i=2;i<end;i++)
{
tmp=first;
last=first+last;
first=last;
last=tmp;
}
System.out.println("Berechnung fertig");
}

Wenn ich die zweite Methode aus einem Thread aufrufe wird der nächste Thread mit den ganzen Ausgaben erst ausgeführt wenn die Berechnung der zweiten Methode beendet worden ist. Wenn die erste Methode zuerst aus dem Thread gestartet wird, beginnt der Thread für die nächste Methode erst garnicht.

Wie kann ich das verhindern?

Aqualon
2004-09-07, 23:25:05
Wie rufst du denn die Threads auf?

Aqua

HellHorse
2004-09-07, 23:35:35
Du hast ziemlich sicher genau den nicht hilfreichen Code gepostet. Vermutlich hast du nur irgendwo einen kleinen Fehler gemacht. :)

Um was in einem eigenen Thread laufen zu lassen, musst du eine Instanz von Thread kreieren und daran die run() methode aufrufen.
Eine sochlche kreierst du entweder indem du eine Subklasse davon machst, oder dem Konstruktor eine Runnable Instanz übergibst.

public class InEinemEigenenThread implements Runnable {
public void run() {
calculate_something(42);
}

}

Ausgeführt wird das ganze dann so:

Thread calculator = new Thread(new InEinemEigenenThread());
calculator.start(); //Achtung start(), nicht run()
sinnfrei();

Hier wird calculate_something(int) in einem eigenen Thread ausgeführt, sinfrei() im Hauptthread.
Wenn alles gut geht. ;)
Wenn beide Berechnungen sehr kurz sind, kann es sein dass sie nacheinander ausgeführt werden. Wenn es dir trotzdem wichtig ist, dass sie sich abwechseln, kannst du probieren zwischendruch mal Thread.yield() aufzurufen.
z.B so:

public void sinnfrei() {
long i=0;
while(true) {
System.out.println(i);
i++;
Thread.yield();
}
}

Falls dann immer noch nur einer ausgeführt wird, blockiert der eine Thread den anderen wohl.

Gast
2004-09-08, 19:37:23
thx funktioniert jetzt :)