Hallo,
hab einen dependency tree. Bestimmte Tasks habn Abhängigkeiten zu anderen Tasks, und können deswegen nicht alle gleichzeitig laufen.
Der tree so (ist ein Graph ):
Und der fehlerhafte ExecutorService
:
ES.invokeAll(Arrays.asList(
Executors.callable(new TaskReadSys() {
@Override
float getDeltaToSystem() {
return 12345;
}
@Override
String getSystemName() {
return "abcd";
}
})
));
ES.invokeAll(Arrays.asList(
Executors.callable(new TaskReadSta() {
@Override
int getMaxLS() {
return 2000;
}
}),
Executors.callable(new TaskReadItm() {
})
));
ES.invokeAll(Arrays.asList(
Executors.callable(new TaskReadLis() {
@Override
int getMinStock() {
return 1;
}
})
));
Thread.sleep(15000);
ES.shutdown();
Abhängigkeiten: Lis zu Itm und Sta, Sta zu Sys.
Jeder Task gibt etwas aus, sobald fertig. Es läuft 3 Minuten (das Sleep nur, damit ich die Ausgabe lesen kann), aber Sta gibt nix aus , es wird vorher beendet und eine Except auch nicht. Wieso ist das so?
Poste ein KSKB.
Ansonsten… klingt als könnte das eher ein Fall für https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html sein, aber ist erstmal nur geraten.
Marco13:
Poste ein KSKB.
Ich hab schon das Problem, das zu faken/stubben…
Denn dabei tritt’s nicht auf, aber seht selbst:
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author
*/
public class NewClass {
public static void main(String[] args) throws InterruptedException {
ExecutorService ES = Executors.newFixedThreadPool(4);
ES.invokeAll(Arrays.asList(
Executors.callable(new TaskReadSys() {
@Override
float getDeltaToSystem() {
return 12345;
}
@Override
String getSystemName() {
return "abcd";
}
})
));
ES.invokeAll(Arrays.asList(
Executors.callable(new TaskReadSta() {
@Override
int getMaxLS() {
return 2000;
}
}),
Executors.callable(new TaskReadItm() {
})
));
ES.invokeAll(Arrays.asList(
Executors.callable(new TaskReadLis() {
@Override
int getMinStock() {
return 1;
}
})
));
Thread.sleep(15000);
ES.shutdown();
}
}
abstract class TaskReadSys implements Runnable {
abstract String getSystemName();
abstract float getDeltaToSystem();
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
System.out.println(ex);
}
System.out.println("should appear before Sta and Itm " + getSystemName() + " " + getDeltaToSystem());
}
}
abstract class TaskReadSta implements Runnable {
abstract int getMaxLS();
@Override
public void run() {
try {
Thread.sleep(4000);
} catch (InterruptedException ex) {
System.out.println(ex);
}
System.out.println("should appear before Lis 1 " + getMaxLS());
}
}
abstract class TaskReadItm implements Runnable {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
System.out.println(ex);
}
System.out.println("should appear before Lis 2");
}
}
abstract class TaskReadLis implements Runnable {
abstract int getMinStock();
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
System.out.println(ex);
}
System.out.println("should appear at last " + getMinStock());
}
}
Beim echt, wird der TaskReadSta
einfach übersprungen., bzw. nicht vollständig.
Wie soll Hilfe hier aussehen? Du hast irgendwelchen Code, der aus nicht erkennbaren Gründen nicht funktioniert. Get over it.
OFFTOPIC: (Hatte mich gestern nicht getraut, das Vid anzuschauen.) Du wirst es vielleicht nicht glauben, aber die Idee mit dem „reuse ES“ hatte ich aus dem Internet…
ONTOPIC: Es funktioniert mittlerweile, und mittlerweile schiebe ich es auf eine RuntimeException
, Maven oder die IDE.