Re: Need some guidance on using timer
Hendrik Maryns wrote:
I have this application which does a rather long computation, possibly
more than exponential in the input. I want to test how far I can go
within reasonable time. So I thought I???d have the program try to
compute stuff for ever bigger inputs, and see how far I got. This used
to work, since the main problem was space, so at a certain moment, an
OOME would occur, which I could catch and start again/continue.
However, now the space problem seems solved, and time is the main
factor. So I want to sort of limit the time the computation takes. I
sort of feel I need to use a Timer for this, and need a separate thread
which interrupts the main one after a certain time. However, I have no
experience at all with multithreading and using Timers, so I would be
very grateful for some guidance on how one could do this.
If you want to interrupt the main thread using the thread interrupt
mechanism, that's easy enough:
public static void main(String[] args) {
final Thread mainThread = Thread.currentThread();
Thread interrupter = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(120*1000);
mainThread.interrupt();
} catch (java.lang.InterruptedException exc) {
// Just exit.
}
}
});
interrupter.setDaemon(true); // Shouldn't keep process alive.
interrupter.start(); // Important.
... do stuff ...
// Let the interrupted exit, if hasn't already.
interrupter.interrupt();
}
Of course that relies on your main code doing something interruptible:
waits/sleeps and, depending upon implementation, I/O. Interrupts can
also cause class loading to fails, at least theoretically.
If it's CPU, probably a better idea is to poll a volatile flag.
import java.util.concurrent.atomic.AtomicBoolean;
public static void main(String[] args) {
final AtomicBoolean stop = new AtomicBoolean();
final Thread mainThread = Thread.currentThread();
Thread interrupter = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(120*1000);
stop = true;
} catch (java.lang.InterruptedException exc) {
// Just exit.
}
}
});
interrupter.setDaemon(true); // Shouldn't keep process alive.
interrupter.start(); // Important.
... do stuff ...
if (stop.get()) {
break;
}
...
// Let the interrupted exit, if hasn't already.
interrupter.interrupt();
}
You can, of course, use java.util.Timer or
java.util.concurrent.ScheduledThreadPoolExecutor instead of the
Thread+sleep.
Tom Hawtin