ExecutorService merkwürdig

threading

#1

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 :smiley: ):

g1

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?
:roll_eyes:


#2

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.


#3

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.


#4

Wie soll Hilfe hier aussehen? Du hast irgendwelchen Code, der aus nicht erkennbaren Gründen nicht funktioniert. Get over it.


#5

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.

:roll_eyes: