Frage zu Threads

andreas_gierisch

Erfahrenes Mitglied
Hallo!
Angenommen ich benutze in einem Programm 2 Threads. Gibt es eine Möglichkeit, dass der erste Thread an einer vorgegebenen Stelle wartet, bis der zweite Thread eine bestimmte Stelle erreicht hat?
 
Je nachdem, was du da synchronisieren willst, geht's vielleicht auch mit join(). Allerdings nur, wenn du darauf warten musst, dass dein anderer Thread beendet wird. Ansonsten so wie madcat das beschrieben hat.

MfG
Daniel
 
Danke erstmal! Der Link von matdacat ist nicht schlecht. Ich bräuchte trotzdem mal ein bisschen Hilfe. Ich versuch mal zu erläutern, was ich machen möchte. Ich habe mehrere Threads, welche jeweils ein Objekt einer Klasse erzeugen. In der Klasse werden umfangreiche Berechnungen durchgeführt. An einer Stelle ist es allerdings notwendig, dass jeder Thread wartet, bis sein Nachfolger an der gleichen Stelle angekommen ist. Das heißt Thread1 wartet auf Thread2, Thread2 auf Thread 3, usw. Erst wenn alle Threads an dieser Stelle angekommen sind, sollen sie weitermachen.
Hier mal ein Code-Beispiel für die Klasse:

Code:
public class Berechnung
{
   //Constructor
   {
      ...
   }
 
   public int main()
   {
      ...
      int i = Methode1();
   }
 
   private int Methode1()
   {
      ...
      for(int j=1; Bedingung; j++)
      {
         ...
         Bedingung = ...;
      }
      return j;
   }
}

Die Bedingung in der for-Schleife hängt von allen Threads ab, das heißt bevor diese ausgerechnet werden kann, müssen alle Threads diese Stelle erreicht haben. Danach wird die nächste Iteration der Schleife durchlaufen und ebenfalls wieder auf alle Threads gewartet.
Wäre schön, wenn mir jemand bei diesem Problem helfen könnte. Ich hoffe ich konnte mein Problem gut darstellen.
 
Soll das ganze also so eine art Fließbandproduktion sein? Thread2 benötigt eine Ausgabe von Thread1. Thread3 von Thread2. Und so weiter...

In dem Falle ist das nen etwas erweitertes Producer Consumer Problem und lässt sich lösen, wie madcat das beschrieben hat.

Oder musst du in einem Hauptprogramm darauf warten, dass alle Threads irgendeinen ein Ergebnis geliefert haben (was im Prinzip auch so ähnlich ablaufen würde).

MfG
Daniel
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author Tom
 * 
 */
public class ThreadingExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final Lock lock = new ReentrantLock(true);

		Runnable runnable0 = new Runnable() {
			public void run() {
				for (int j = 0; j < 5; j++) {
					try {
						try {
							lock.lock();
							for (int i = 0; i < 10; i++) {
								System.out.println(i);
								TimeUnit.MILLISECONDS.sleep(250);
							}
						} finally {
							lock.unlock();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		};

		Runnable runnable1 = new Runnable() {
			public void run() {
				int i = 0;
				while (i < 5) {
					try {
						try {
							lock.lock();
							System.out.println(System.nanoTime() + " BUBU");
							i++;
						} finally {
							lock.unlock();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		};

		ExecutorService executorService = Executors.newCachedThreadPool();
		executorService.execute(runnable0);
		executorService.execute(runnable1);

		executorService.shutdown();
	}
}

Gruß Tom
 
Zurück