# Thread soll anderen Thread beenden



## Bongo (15. Mai 2009)

Hallo Forum,

ich überlege schon seit eigener Zeit wie man folgendes realisieren könnte:

Es sollen zwei Threads laufen. Thread 1 zählt bis 1.000.000 und Thread 2 zählt bis 10.000.000. Wenn Thread 1 fertig ist, soll Thread 2 beendet werden und ausgegeben werden, bis wohin Thread 2 gekommen ist.
Vielleicht auch mit verschiedenen Prioritäten.

Hat da jemand eine Lösung für mich?

Vielen Dank,
Bongo


----------



## Geeeee (15. Mai 2009)

Prioritäten sind VM abhängig und wie fast alles beim Thread kaum verlässlich.
Man kann andere Threads nicht ins nirvana schicken, die müssen sich schon selber beenden (bei einem ordentlichen Programm). 
1. Du könntest ein synchronized Object nehmen auf das du prüfst, ob es irgendwas gesetzt hat. Reicht ja eigentlich schon ein Boolean. Wenn Thread1 fertig ist, dann setzt er den auf true.
Nachteil: Overhead im zweiten Thread durch die Überprüfung der Bedingung.
2. Die Variable die hochgezählt wird ist von außen erreichbar bzw. nicht als Instanzvariable des Threads sondern als Parameter. Wenn dir eine "ungefähre" Anzahl ausreicht, kannst du sie am Ende von Thread1 direkt auslesen. Ansonsten wiederum ein Objekt machen und es synchronized halten.
Nachteil fällt mir gerade keine ein, also würde ich es so machen.


----------



## Verjigorm (15. Mai 2009)

Sowas?


```
public class TwoThreads {

	private static final Thread t1 = new MyThread1();
	private static final Thread t2 = new MyThread2();
	
	public static void main(String[] args) 
	{
		t1.start();
		t2.start();
	}

	static class MyThread1 extends Thread
	{
		
		@Override
		public void run()
		{
			try {
				sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			t2.interrupt();
		}
	}
	
	static class MyThread2 extends Thread
	{
		private int i = 1;
		
		@Override
		public void run()
		{
			while(!isInterrupted())
			{
				System.out.println(i++);
			}
		}
	}
}
```


----------



## Geeeee (15. Mai 2009)

Darauf ziehe ich meine Aussage zu interrupt zurück 
Hatte gerade irgendwie viel zuviel wait, notify etc. im Kopf. In dem Beispiel kann man sich auf den interrupt call verlassen.


----------



## dergrüne (15. Mai 2009)

interrupt geht da schon von daher fein gelöst.

Kleine Anmerkung die Aufgabe von Thread 2 in jedem Schleifendurchlauf, verlangsamt das Programm ennorm, wenn du nur wissen willst wie weit Thread zwei gekommen ist, dann lass dir doch einfach nach der While-Schleife einmalig "i" ausgeben. Erstens läufts dann fixer und zweitens spamst du dir nicht die Konsole zu.

Gruß


----------



## Verjigorm (15. Mai 2009)

Ist ja auch nur zur Veranschaulichung


----------

