ThreadExecutorService "stirbt heimlich"

NetzUnity und Informatik-forum wurden zusammengelegt. Eine entsprechende Ankündigung wird demnächst noch folgen. Für 2025 ist hier einiges geplant! Bei Fragen bitte per DM an Maximilian Rupp wenden.
  • Hallo!

    Ich möchte mehrere Threads laufen lassen, aber es scheint, als würden sich diese "manchmal" stillschweigend verabschieden. Die Idee ist, dass ich zu bestimmten Zeiten bestimmte Services (täglich) laufen lasse. Wenn ich zb 6 Services (Threads über Threads Exector) laufen habe, passiert es bei 6 Threads nach 3 Tagen das zb 1 einfach nicht "schaltet". Als Fehlerquelle sehe ich eigentlich nur meinen grundsätzlichen Aufbau.

    irgendwelche Tips? man liest ja, dass zb threads sofern sie keine demons sind, einfach wegsterben können, falls exceptions auftreten. Jedoch habe ich meinen kompletten Thread in ein try-catch gepackt, als auch denke ich, dass man den ThreadExector Service nicht als "Demon" markieren muss.

    Aufgerufen wird der Code in meiner Main Methode, aber die Main selbst beendet sich natürlich. (könnte vielleicht das auch das problem sein?)

    Main startet services, und services sind thread exectors, welche über
    .startTimerOnNextOccasion(Zeit in der Zukunft) gestartet werden. "NextOccation" heisst übrigens nur, dass ich zb wenn ich heute 08:00 einstelle, aber es bereits 09:00 ist, natürlich erst mit morgen 08:00 gestartet werden soll.
    package com.ptrade;

    import com.ptrade.service.ServiceManager;

    public class Main {

    static ServiceManager serviceManager;

    public static void main(String[] args) {

    serviceManager = ServiceManager.getInstance();

    serviceManager.initServices();
    serviceManager.registerServices();
    serviceManager.startServices();

    }
    }

    package com.ptrade.service.ptrade;

    import java.util.Date;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;

    import com.ptrade.service.HelperService;
    import com.ptrade.service.MessageService.MessageType;
    import com.ptrade.service.objects.SimpleTime;

    public abstract class PTradeScheduledNotificationService extends
    PTradeNotificationService {

    public final static long ONCE_PER_DAY = 1000 * 60 * 60 * 24;
    public final static long ONCE_PER_HOUR = 1000 * 60 * 60;
    public final static long ONCE_PER_MIN = 1000 * 60;
    public final static long ONCE_PER_5MIN = 1000 * 60 * 5;
    public final static long ONCE_PER_SEC = 1000;
    public final static long TWO_MINS_IN_MS = 1000 * 60 * 2;

    private final ScheduledExecutorService scheduler = Executors
    .newScheduledThreadPool(1);

    public Date lastAlarmDate = null;

    public void startTimer(long delay, int period, TimeUnit timeUnit) {

    try {
    ScheduledExecutorService scheduler = Executors
    .newScheduledThreadPool(1);

    logger.info("Delay: " + delay + " Period: " + period
    + " TimeUnit: " + timeUnit + " Class: "
    + getClass().getSimpleName());
    Runnable toRun = new Runnable() {
    public void run() {
    schedule();
    }
    };
    scheduler.scheduleAtFixedRate(toRun, delay, period, timeUnit);
    } catch (Exception e) {
    throwThreadErrorMsg(e);
    }
    }

    private void throwThreadErrorMsg(Exception e) {
    logger.error("Thread as thrown an error; " + e.toString());
    getMessageService().sendMessage(getClass(), MessageType.FATAL,
    "A thread as encountered a problem");
    }

    /*
    * This timer function starts the timer on the next possible occastion.
    */
    public void startTimerOnNextOccasion(int hour_of_day, int min, int second,
    long period) {

    Date futureDate = HelperService.getNextOccasionDate(hour_of_day, min,
    second);

    logger.info(futureDate + ": " + getClass().getSimpleName());
    lastAlarmDate = futureDate;

    try {

    scheduler.scheduleAtFixedRate(new Runnable() {
    public void run() {
    schedule();
    }
    }, HelperService.getSecondsDiff(new Date(), futureDate),
    60 * 60 * 24, TimeUnit.SECONDS);

    }

    catch (Exception e) {

    throwThreadErrorMsg(e);
    }
    }

    public void startTimersOnNextOccasion(String[] simpleTimeStringArray, long period) {

    if (simpleTimeStringArray != null && simpleTimeStringArray.length > 0) {

    for (int i = 0; i < simpleTimeStringArray.length; i++) {
    createTimerFromString(simpleTimeStringArray[i], period);
    }
    }
    }

    public void startTimerOnNextOccasion(String simpleTimeString, long period) {

    createTimerFromString(simpleTimeString, period);
    }

    private void createTimerFromString(String simpleTimeString, long period) {
    if (simpleTimeString != null && simpleTimeString.trim().length() > 0) {

    SimpleTime st = new SimpleTime(simpleTimeString);
    startTimerOnNextOccasion(st.getHour(), st.getMin(), st.getSec(),
    period);
    }
    }

    public void startTimerOnNextOccasion(int hour, int min, long period) {
    startTimerOnNextOccasion(hour, min, 0, period);
    }

    public abstract void schedule();

    protected void sleepMinutes(int minutes) {
    try {
    Thread.sleep(minutes * 1000 * 60);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    throwThreadErrorMsg(e);
    }
    }

    protected void sleepSeconds(int seconds) {
    try {
    Thread.sleep(seconds * 1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    throwThreadErrorMsg(e);
    }
    }

    protected void sleep(int milliseconds) {
    try {
    Thread.sleep(milliseconds);
    } catch (InterruptedException e) {
    e.printStackTrace();
    throwThreadErrorMsg(e);
    }
    }

    public Date getLastAlarmDate() {
    return lastAlarmDate;
    }

    }

  • Ich will mir diesen Code, bei dem sämtliche Einrückungen aufgrund fehlender CODE-Tags verloren gegangen sind, jetzt nicht durchlesen; mein Rat ist folgender: Erfinde das Rad nicht neu.

    Lösungen, die Programme zu bestimmten Zeiten aufrufen können, gibt es bereits (z.B. Cron). Mit solchen Lösungen vermeidest du ggf. auch, Prozesse zu haben, die nichts anderes tun als zu warten und Arbeitsspeicher zu verbrauchen. Könntest du die Aufgabe, die du bewältigen versuchst, nicht darauf aufbauen?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!