Concurrency and restarting tasks

Discussion in 'Java' started by me 2, Feb 26, 2013.

  1. me 2

    me 2 Guest

    Hey,

    I have an interesting (to me at least!) puzzle.

    I have a task that can take a long time that I need to run periodically. Iwant to be able to cancel the execution of that task. I've been looking at the Scheduler and Future objects, but I haven't seen how to cleanly stop,wait for a couple of seconds and restart the task on schedule. And my task won't always take X seconds--sometimes it will generate exceptions or take longer or shorter or any number of other things.

    Right now I have:

    <code>
    final Runnable beeper = new Runnable()
    {
    public void run()
    {
    System.out.println("beep -- doing long task");
    //doing long task
    System.out.println("finished doing long task");
    }
    };

    ScheduledFuture<?> beeperHandle;
    try {
    beeperHandle = scheduler.scheduleAtFixedRate( beeper, 1, 2, SECONDS);
    beeperHandle.get(3, SECONDS);
    } catch (TimeoutException te) {
    System.out.println("Canceled due to timeout");
    } catch (InterruptedException | ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    </code>

    There are plenty of examples that show the first steps--setting up the schedule and canceling. Restarting apparently is not as common.

    Any ideas would be fantastic.
    Thank you,
    Me
    me 2, Feb 26, 2013
    #1
    1. Advertising

  2. me 2

    Roedy Green Guest

    On Tue, 26 Feb 2013 06:32:28 -0800 (PST), me 2
    <> wrote, quoted or indirectly quoted someone
    who said :

    > I=
    > want to be able to cancel the execution of that task.


    To kill cleanly, the task must periodically check if it should quit
    and commit suicide at a convenient point after cleaning up.

    See StoppableThread, part of
    http://mindprod.com/products1.html#COMMON11
    --
    Roedy Green Canadian Mind Products http://mindprod.com
    One thing I love about having a website, is that when I complain about
    something, I only have to do it once. It saves me endless hours of
    grumbling.
    Roedy Green, Feb 26, 2013
    #2
    1. Advertising

  3. me 2

    Joerg Meier Guest

    On Tue, 26 Feb 2013 06:32:28 -0800 (PST), me 2 wrote:

    > I have an interesting (to me at least!) puzzle.


    > I have a task that can take a long time that I need to run periodically. I want to be able to cancel the execution of that task. I've been looking at the Scheduler and Future objects, but I haven't seen how to cleanly stop, wait for a couple of seconds and restart the task on schedule. And my task won't always take X seconds--sometimes it will generate exceptions or take longer or shorter or any number of other things.


    > There are plenty of examples that show the first steps--setting up the schedule and canceling. Restarting apparently is not as common.


    As I understand, ThreadS are simply not made to be resumed after being
    cancelled. What you want might simply not be possible. That being said, it
    shouldn't be too hard to simply make a new Thread with your Runnable and
    start that instead of restarting the cancelled one.

    Alternatively, you can make your long running task somehow check for a
    volatile flag and pause if it's set to something.

    Liebe Gruesse,
    Joerg

    --
    Ich lese meine Emails nicht, replies to Email bleiben also leider
    ungelesen.
    Joerg Meier, Feb 26, 2013
    #3
  4. me 2

    me 2 Guest

    On Tuesday, February 26, 2013 9:58:28 AM UTC-5, Joerg Meier wrote:
    > On Tue, 26 Feb 2013 06:32:28 -0800 (PST), me 2 wrote:
    >
    >
    >
    > > I have an interesting (to me at least!) puzzle.

    >
    >
    >
    > > I have a task that can take a long time that I need to run periodically.. I want to be able to cancel the execution of that task. I've been looking at the Scheduler and Future objects, but I haven't seen how to cleanly stop, wait for a couple of seconds and restart the task on schedule. And mytask won't always take X seconds--sometimes it will generate exceptions ortake longer or shorter or any number of other things.

    >
    >
    >
    > > There are plenty of examples that show the first steps--setting up the schedule and canceling. Restarting apparently is not as common.

    >
    >
    >
    > As I understand, ThreadS are simply not made to be resumed after being
    >
    > cancelled. What you want might simply not be possible. That being said, it
    >
    > shouldn't be too hard to simply make a new Thread with your Runnable and
    >
    > start that instead of restarting the cancelled one.
    >
    >
    >
    > Alternatively, you can make your long running task somehow check for a
    >
    > volatile flag and pause if it's set to something.
    >
    >
    >
    > Liebe Gruesse,
    >
    > Joerg
    >
    >
    >
    > --
    >
    > Ich lese meine Emails nicht, replies to Email bleiben also leider
    >
    > ungelesen.


    Hey,

    I suppose you are right. That doesn't make much sense when you put it likethat.

    The problem is that I need an event to fire if the task doesn't complete inX seconds. I guess I don't really care about canceling the thread--just getting the event to fire and then getting set up to attempt the task again.

    The double setup with the two scheduled tasks--one to start and one to cancel--gets muddled after like the 4th iteration.

    Hmmm....

    I'll keep looking.
    Me
    me 2, Feb 26, 2013
    #4
  5. me 2

    Joerg Meier Guest

    On Tue, 26 Feb 2013 08:09:14 -0800 (PST), me 2 wrote:


    > The problem is that I need an event to fire if the task doesn't complete in X seconds. I guess I don't really care about canceling the thread--just getting the event to fire and then getting set up to attempt the task again.


    > The double setup with the two scheduled tasks--one to start and one to cancel--gets muddled after like the 4th iteration.


    If I understand your problem correctly, the following should be helpful -
    but do read why Thread.stop was deprecated. It would be much, much better
    if you could change your design to avoid needing it. With that disclaimer:

    package com.usenet.watchdog;

    import java.net.Socket;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;

    public class WatchDog {
    private final long LIMIT = 5000; // 10
    seconds

    private final DateFormat DF = new SimpleDateFormat("mm 'minutes,' ss
    'seconds,' S 'milliseconds'");
    private final long START = System.currentTimeMillis();

    private WorkerThread worker;

    private String timestamp() {
    return DF.format(new Date(System.currentTimeMillis() - START));
    }

    private class WorkerThread extends Thread {
    private final Object workload;
    private final long started = System.currentTimeMillis();

    public WorkerThread(final Object workload) {
    this.workload = workload;
    }

    @Override
    public void run() {
    System.out.println(timestamp() + " - (WorkerThread) started");
    System.out.println(timestamp() + " - (WorkerThread) doing stuff with " +
    workload);
    while (true) {
    if (System.currentTimeMillis() % 1000 == 0) {
    System.out.println(timestamp() + " - (WorkerThread) ping");
    }
    }
    }
    }

    private class WatchdogThread extends TimerTask {
    @Override
    public void run() {
    System.out.println(timestamp() + " - (WatchdogThread) checking if worker
    thread is over the time limit");
    if (System.currentTimeMillis() - worker.started > LIMIT) {
    System.out.println(timestamp() + " - (WatchdogThread) worker has been
    working too long, resetting it");
    worker.stop();
    final Object workload = worker.workload;
    worker = new WorkerThread(workload);
    worker.start();
    }
    }
    }

    public static void main(final String[] args) {
    new WatchDog().start();
    }

    private void start() {
    System.out.println(timestamp() + " - (main) Starting run");
    worker = new WorkerThread(new Socket());
    worker.start();
    final Timer timer = new Timer();
    timer.scheduleAtFixedRate(new WatchdogThread(), 1000, 863);
    }
    }

    A somewhat more readable version, including some example output, can be
    seen here:

    <http://pastebin.com/5gcLPS8D>

    And a good writeup of why not to use Thread.stop - basically, any objects
    the stopped Thread touched (in this case workload) could be damaged beyond
    repair. Read more at:

    <http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html>

    Liebe Gruesse,
    Joerg

    --
    Ich lese meine Emails nicht, replies to Email bleiben also leider
    ungelesen.
    Joerg Meier, Feb 26, 2013
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. sonic
    Replies:
    0
    Views:
    341
    sonic
    May 23, 2006
  2. zb
    Replies:
    7
    Views:
    796
  3. walterbyrd
    Replies:
    9
    Views:
    288
    Bruno Desthuilliers
    Nov 19, 2006
  4. Curt Sampson

    Signals and Restarting Syscalls

    Curt Sampson, Jan 7, 2007, in forum: Ruby
    Replies:
    0
    Views:
    85
    Curt Sampson
    Jan 7, 2007
  5. Jason Friedman
    Replies:
    0
    Views:
    57
    Jason Friedman
    Dec 26, 2013
Loading...

Share This Page