Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   Concurrency and restarting tasks (http://www.velocityreviews.com/forums/t958088-concurrency-and-restarting-tasks.html)

me 2 02-26-2013 02:32 PM

Concurrency and restarting tasks
 
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

Roedy Green 02-26-2013 02:47 PM

Re: Concurrency and restarting tasks
 
On Tue, 26 Feb 2013 06:32:28 -0800 (PST), me 2
<winona_whitener@yahoo.com> 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.

Joerg Meier 02-26-2013 02:58 PM

Re: Concurrency and restarting tasks
 
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.

me 2 02-26-2013 04:09 PM

Re: Concurrency and restarting tasks
 
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

Joerg Meier 02-26-2013 05:14 PM

Re: Concurrency and restarting tasks
 
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.


All times are GMT. The time now is 01:20 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.