# run()-Code zweier Threads strikt abwechselnd ausführen



## Murmeltier (30. Mai 2004)

Hi, 

ist es möglich, eine Anwendung, in der 2Threads vorkommen so zu programmieren, dass der Sheduler immer
genau nur einmal den Code inerhalb der Run Anweisung ausführt, und dann zum anderen Thread wecheslt.
Beide Threads haben eine endlos While Schleife.
Gibt es dazu ein Stichwort?

Kurzes Google ergab nicht viel weil Threads nunmal immer abwechselnd ausgeführt werden, ich bruache aber den Fall, dass eben zwei Threads im Wechsel ausgeführt werden, wobei der Code jedes Threads aber nur geneu !einmal!durchlaufen wird und dann der Wechsel stattfindet.

Danke!


----------



## Roar (30. Mai 2004)

wenn du das so machen willst wozu benutzt du dann threads !?!?



> weil Threads nunmal immer abwechselnd ausgeführt werden



Threads werden gleichzeitig ausgeführt


----------



## Murmeltier (30. Mai 2004)

Klar, Threads werden schon "gleichzeitig" ausgeführt, aber nicht wirklich.
Auf einem Rechner mit ein CPU kann nur ein Prozess gleichzeitig laufen.
Das siehst du ja wenn du dir diverse Besipiele anschaust, wenn z.B. Threads einen gemeinsamen Zähler hoch oder runterzählen. Der Sheduler, also der Teil des Betriebssystems, der sich darum kümmert, nach welcher Logik einzelene Prozesse Rechenzeit bekommen, lässt die Threads auch nur Nacheinander an die CPU und nie gleichzeitig.
Aber eben weil es Threads gibt, kann ein Programm quasi mehere Sachen gleichzeitig machen, weil der Sheduler jeden Thrad quasi einzeln betrachtet, d.h. wenn du ein Progarmm hast in dem du 2 Thrads erzeugst würde volgendes passieren:

Hauptprogramm wird geladen und bekommt 10ms Rechenzeit <<hier werden z.B. Thread 1 und 2 erzeugt.
Thread1 bekommt dann auch 10ms
Thread2 bekommt 10 ms
Excel bekommt 10 ms
Word bekommt 10ms....
[....]
dann wieder Hauptprogramm
Thread1
Thread2.

Du vestehst was ich meine ; ) ?!

So und jetzt konkret zu meinem Prblem.
Ich habe einen Kicker (kürzlich schon mal anastzweise geschildert) als Java-Applet und 2 Threads.
Ein Thread ruf periodisch repaint, die Methode zur Ballberechneung (also nächste Position), und Kollisionabfrage auf.
Der andere Thread  ist für die Animation für Schuss zuständig. Der andere für die Animation d. Schusses, also das Rotieren von Spieler um eine Stange.

Problem: D. Thread (unten) bekommt sagen wir 40ms Rechenzeit, in der mein Rechner es schafft das Bild um 4 Bilder (was 40° entspricht)
weiterzuschalten, dann ensteht das Prblem, dass Kollisionberechnung nicht erfolgt, sondern erst wenn der Thread die CPU wieder freigibt. Logsicher wäre es, wenn  immer, nachdem ein Bild weitergeschlaten wurde, Kollision und nächste Position aufgerufen würde. 
Ich könnte noch ein weiteres Problem schildern aber lasse es erstmal dabei, weils eh schon genug Text ist ; ).
Falls du dir mal ein Bild machen möchtest

http://www.abileave2002.de/entwurf/idex.html 


```
public  void run()
  {

      while (iAktBild < 35)
      {

      //ein Bild weiterschalten
      iAktBild++;
      try {Thread.sleep(iSchussRefresh);}
      catch (InterruptedException e) {}
     }

      //Anim ist durchgelaufen, wieder 0 bild setzten

      iAktBild = 0;
      bSchussThread = true; // es kann wieder die Schusstaste betätigt werden
```

Gruß.......


----------



## Beni (30. Mai 2004)

Lustiges Feature: wenn dein Applet in meinem Mozilla läuft, funktioniert die Tastatur nicht mehr...

Aber abgesehen davon: wenn die zwei Threads sowieso immer abwechselnd am Zug sind, kannst du wirklich auch nur einen verwenden:


```
public void run(){
  // Kollisionsabfrage, etc...
  calculateCollisionAndOtherStrangeThings();

  // repaint
  component.repaint();
}
```

Es sei denn, du hast noch was anderes vor.

mfg Beni


----------



## Murmeltier (30. Mai 2004)

Ja, ähm ich hab im Moment im Thread requestFocus(), deswegen klaut er dir wahrschienlich immer den Fokus. Sorry; )Klar im Prinzip hast ja Recht, ABER die Animation  (Rotieruen um Stange) muss mit eine Sleep von ca 15ms laufen, damit sie hablwegs ok aussieht. Die Ballberechnung sollte aber nur alle 25ms laufen, weil die Schrittweite (in Pixeln) quasi festgelegt ist (nimm einfach an bei 1Pixel und Sleep von 15 wäre er immer noch zu schnell), 
und der Ball sonst einfach zu sehr abgeht.



			
				Beni hat gesagt.:
			
		

> Lustiges Feature: wenn dein Applet in meinem Mozilla läuft, funktioniert die Tastatur nicht mehr...
> Aber abgesehen davon: wenn die zwei Threads sowieso immer abwechselnd am Zug sind, kannst du wirklich auch nur einen verwenden:



Abwechselnd ja, aber die run() Methode eines Threads KANN dabei mehrmals durchlaufen werden, bevor der Wechesel drankommt.

Junge, ist das kompliziert... : )
 :roll:


----------



## Murmeltier (30. Mai 2004)

Ok ich denke mir ist gerade ein Besipiel eingefallen, da sieht man sehr gut wo das Problem ist!

Thread1 ruft auf: (Sleep 25ms): 
1. nächste Position  (setzt x, und y von Ball neu)
2. Kollision (prüft ob neue Position eine Kollsiion verursacht, wenn ja wird der Winkel des Balls entsprechen geändert)
3. reapint
4. Sleep

Thread2 ruft auf (Sleep 15ms):
1. Bild weiterschalten (aniniert also eine Spielerreihe)

Problem von Oben:

```
Spieler 
     Ball
----  
||||
||||O
----
```

Angenommen, der Ball landet sagen wir mal ein Pixel vor den Füssen des Spielers (er guckt nach rechts; Thread1 wurde soeben durchlaufen), und Schuss wird betätigt, so kann es sein, dass Thread2 in seiner Zeit (>Sheduler) es schafft den Spieler in die 40°Position zu bringen. Währden dieser Zeit findet aber keine Kollisionabfrage statt 
>> Resulatat: Der Spieler hat sich zwar über den Ball bewegt, ihn aber nicht merklich verändert.

Schlimmer noch, es kann sogar sein, dass er beim über-den-Ball-Bewegen just in dem Moment unterbrochen wird (von Thread1), indem der linke Teil seines Blockes(Fußes) über dem Ball schwebt und die Kollisionsabfrage führt die Kollsion in die falsche Richtung(nämlich nach links) aus.

*schnief*
 :bahnhof:


----------



## Murmeltier (31. Mai 2004)

Keine ne Idee, oder ists schlecht verständlich woruaf ich hinuas will?!


----------



## Beni (31. Mai 2004)

Murmeltier hat gesagt.:
			
		

> Keine ne Idee, oder ists schlecht verständlich woruaf ich hinuas will?!


Sowohl, als auch...


----------

