Concurrency and restarting tasks

M

me 2

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
 
J

Joerg Meier

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
 
M

me 2

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
 
J

Joerg Meier

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top