Hallo!
Ich habe einige Basic Fragen zum ExecutorService.
Ich habe mehrere Klassen, die als Thread gestartet werden sollen. Manche laufen in einem Loop und warten auf Daten, andere starten und beenden danach wieder.
1. Frage: Alle 4 Aufrufe sind ident. Es macht keinen Unterschied, ob ich von einer Klasse zuerst ein Objekt erzeuge oder gleich direkt, richtig?
2. Frage: Die LoopClass läuft eben im loop und beendet nicht und die StartStopClass beendet nach dem Durchlauf von run(), richtig? (LoopClass und StartStopClass sind richtig?)
3. Frage: Diejenigen die im Loop laufen, möchte ich zur Laufzeit Methoden aufrufen. Das erreiche ich damit:
4. Frage: Die Ausführung ist so richtig? Deswegen habe ich vorher ein Objekt erzeugt, um den passenden "Thread" direkt anzusprechen.
5. Frage: Durch den "static" habe alle Instanzen der LoopClass den Wert 5 bei "y". Static bedeutet das alle Instanzen den selben Wert haben. Egal bei welcher Instanz der Wert neu zugewiesen wurde, richtig?
6. Frage: Ich beende ALLE Threads mittels: "newCachedThreadPool.shutdownNow();"
6.1 Frage: Wie könnte ich einzelne Threads im "newCachedThreadPool" beenden lassen?
7. Frage: Ein .newCachedThreadPool() soll nicht nur selbe oder ähnliche Klassen beinhalten, oder? Ich kann mit einem .newCachedThreadPool() alle Arten von Threads erzeugen. (Könnt ja sein das man damit nur Mehrfachinstanzen der selben Klasse erstellen soll)
Ich bin der Meinung, dass eine Klasse bei mir einmal in der "call()" ohne dem "while (!Thread.interrupted())" nicht beendet hat. Ich konnte eine Methode aufrufen (bsp: "startStopClass.Methode.."). Aber wenn der Thread beendet hätte, dürfte das ja gar nicht gehen, oder?
Habt vielen Dank!
Ich habe einige Basic Fragen zum ExecutorService.
Ich habe mehrere Klassen, die als Thread gestartet werden sollen. Manche laufen in einem Loop und warten auf Daten, andere starten und beenden danach wieder.
Java:
public class LoopClass implements Callable<Void> {
private int x;
static private int y;
public void setXY(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public Void call() throws Exception {
while (!Thread.interrupted()) {
// bla bla
}
return null;
}
}
Java:
public class StartStopClass implements Callable<Void> {
@Override
public Void call() throws Exception {
// bla bla
return null;
}
}
Java:
private ExecutorService newCachedThreadPool = Executors
.newCachedThreadPool();
LoopClass loopClass = new LoopClass();
StartStopClass startStopClass = new StartStopClass();
newCachedThreadPool.submit(loopClass);
newCachedThreadPool.submit(new LoopClass());
newCachedThreadPool.submit(startStopClass);
newCachedThreadPool.submit(new StartStopClass());
2. Frage: Die LoopClass läuft eben im loop und beendet nicht und die StartStopClass beendet nach dem Durchlauf von run(), richtig? (LoopClass und StartStopClass sind richtig?)
3. Frage: Diejenigen die im Loop laufen, möchte ich zur Laufzeit Methoden aufrufen. Das erreiche ich damit:
Java:
loopClass.setXY(4,5);
5. Frage: Durch den "static" habe alle Instanzen der LoopClass den Wert 5 bei "y". Static bedeutet das alle Instanzen den selben Wert haben. Egal bei welcher Instanz der Wert neu zugewiesen wurde, richtig?
6. Frage: Ich beende ALLE Threads mittels: "newCachedThreadPool.shutdownNow();"
6.1 Frage: Wie könnte ich einzelne Threads im "newCachedThreadPool" beenden lassen?
7. Frage: Ein .newCachedThreadPool() soll nicht nur selbe oder ähnliche Klassen beinhalten, oder? Ich kann mit einem .newCachedThreadPool() alle Arten von Threads erzeugen. (Könnt ja sein das man damit nur Mehrfachinstanzen der selben Klasse erstellen soll)
Ich bin der Meinung, dass eine Klasse bei mir einmal in der "call()" ohne dem "while (!Thread.interrupted())" nicht beendet hat. Ich konnte eine Methode aufrufen (bsp: "startStopClass.Methode.."). Aber wenn der Thread beendet hätte, dürfte das ja gar nicht gehen, oder?
Habt vielen Dank!