Thread stoppen - name bekannt

steffi_ma

Grünschnabel
Hi,
ich möchte einen Thread, von dem ich den Namen weiss, gerne stoppen. Allerdings weiss ich nicht, wie das geht.

wenn ich folgendes mache, klappt das nicht, da ich ja eigentlich einen neuen Thread anlege und nicht den Alten stoppe.
Code:
Thread t = new Thread();
t.setName(name);
t.stop();
Wie mache ich denn das?
ich weiss, dass man stop() nicht verwenden soll, aber es muss sein und ist auch gewollt.
steffi
 
Der Threat muss entweder in dem Stoppenden Objekt bekannt sein, oder der Fuktion, die das stop macht.
Um dann zu Stoppen musst du den Thread übergeben.
Also zum Beispiel:
Code:
public void stopIt(Thread t){
t.stop();
}
 
Du musst doch irgendwo den Thread referenziert haben?
Hast du in dem Thread irgendwo einen namens-String definiert?

Bitte mehr informationen, oder paste mal deinen Source zum besseren Verständnis.
 
Hi,
klar habe ich den Thread irgendwo benannt :-)
Code:
public class AA extends Thread {
...
t = new Task();
t.setName(fileName);
t.start();
...
}
In diesem Thread werden Dateien ausgeführt. Wenn nun in einer was ungültiges steht, soll der Thread gestoppt werden. Nach einer bestimmten Zeit wird also nachgefragt, ob der Job korrekt ausgeführt wurde oder noch immer läuft. Wenn er noch läuft, soll eine Methode aufgerufen werden, die den entsprechenden Thread killt. Ich weiss aber dann nur den Namen des Threads, da es von einem anderen System nachgefragt wird.
Code:
public class BB extends Thread {
...
public static boolean killThread(String name) {
 hier soll dann der entsprechende Thread gekillt werden.
 t.stop();
}
...
}
 
Code:
AA-Objekt.t.stop()
Also, den Namen alleine lassen, den Thread des Objekte ansprechen :)
 
Zuletzt bearbeitet:
Thread#stop() ist rausgenommen und sollte nicht mehr benutzt werden weil diese Methode
zu negativen Nebenwirkungen führte.

Threads laufen besser in einer Schleife

Code:
public void run() {
  while(pleaseRun) {
     // tu etwas
  }
}

// stoppen:
setPleaseRun(false);

läuft der Thread nicht in einer Schleife, so wird der Thread automatisch dann
gestopt wenn er die run Methode abgearbeitet hat.
Das führt dazu das per return sich so weit nach oben hangeln sollte bis mann
die run Methode mit einem return verlassen kann.
 
Hallo!

Versuchs mal hiermit:
Code:
package de.tutorials;

public class ThreadTest {

	public static void main(String[] args) {
		new ThreadTest().doIt();
	}

	private void doIt() {
		T t0 = new T("t0");
		T t1 = new T("t1");

		t0.start();
		t1.start();

		try {
			Thread.sleep(2000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		Thread t = findThread("t0");
		if (t != null)
			t.interrupt();

		try {
			Thread.sleep(2000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		t = findThread("t1");
		if (t != null)
			t.interrupt();

	}

	private Thread findThread(String name) {

		Thread[] threads = new Thread[Thread.activeCount()];
		Thread.enumerate(threads);

		for (int i = 0; i < threads.length; i++) {
			if (threads[i].getName().equals(name))
				return threads[i];
		}
		return null;
	}

	class T extends Thread {

		public T(String name) {
			super(name);
			setPriority(MIN_PRIORITY);
		}

		public void run() {
			while (true) {
				System.out.println(getName());
				try {
					sleep(1000L);
				} catch (InterruptedException e) {
					e.printStackTrace();
					System.out.println(getName() + " wurde beendet...");
					break;
				}
			}
		}
	}
}

Gruß Tom
 
Hmm, naja, das hatte ich eigentlich auch gedacht vorzuschlagen, allerdings ist es dann wirklich einfacher (und wie ich finde sauberer die Referenz auf den Thread zu verwalten, anstatt ihn dann nochmal mit namen zu suchen!).
 
okay, das habe ich alles probiert, aber ich bekomme das nicht hin.

In meiner run-Methode lasse ich einen Prozess ausführen. wenn dieser nicht beendet wird, muss doch der Thread ebenfalls noch leben, oder

Code:
run(){..
hier ist Thread.activeCount()); >1
Process p = Runtime.getRuntime().exec(command);
..
}
dann möchte ich den Thread killen:
Code:
public static void doKillJob(String name) 
{
  try 
  {
    Thread t = doFindThread(name);
    if (t != null) --> t ist aber null!
      t.stop();
  }
}
Code:
private static Thread doFindThread(String name) {
  System.out.println("Thread.activeCount()); --> hier nur 1

  Thread[] threads = new Thread[Thread.activeCount()];
  Thread.enumerate(threads);
  for (int i = 0; i < threads.length; i++) 
  {
	System.out.println(threads[i].getName()); --> main
	if (threads[i].getName().equals(name))
	 	return threads[i];
  }
  return null;
}
wenn ich den Thread starte, sind 3 Threads vorhanden, ich wenn ich den thread stoppen will, ist nur noch einer aktiv. Wo hab ich denn da jetzt meinen Denkfehler?
steffi
 
Zurück