Terminating a thread when program exits.

I

Ian Wilson

Sun's developer online training website has an example of a JDBC
connection pool.
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

One of the things it does is start a "reaper" thread that watches for
stale connections (see below).

If I run my test program from Eclipse, this reaper thread keeps running
when my program has otherwise finished. I didn't notice this to start
with and so after a few test runs Eclipse started reporting that the VM
was out of memory.

I think I need to replace "while(true") below with "while(poolExists)"
and set poolExists to false somehow when my program wants to exit.

The JDCConnectionPool is instantiated by the constructor of
JDCConnectionDriver which I instantiate in my application start-up.

Because the pool is written as a JDBC driver wrapper, there's not much
leverage for the app to force a clean up.

I suppose I could add a finalize() to JDCConnectionDriver and some
methods in JDBCConnectionPool and ConnectionReaper to set poolExists false.

I'm not sure if this is a good way to go about this, ideas?

Also the sleep() lasts 5 mins, I'd prefer some way to force a quicker
interruption of this sleep() - Thread.interrupt()?

---------------- from JDCConnectionPool -----------------------
class ConnectionReaper extends Thread {

private JDCConnectionPool pool;
private final long delay=300000;

ConnectionReaper(JDCConnectionPool pool) {
this.pool=pool;
}

public void run() {
while(true) {
try {
sleep(delay);
} catch( InterruptedException e) { }
pool.reapConnections();
}
}
}
-----------------------------------------
 
T

Thomas Fritsch

Ian Wilson wrote:
[...]
If I run my test program from Eclipse, this reaper thread keeps running
when my program has otherwise finished. [...]
class ConnectionReaper extends Thread {

private JDCConnectionPool pool;
private final long delay=300000;

ConnectionReaper(JDCConnectionPool pool) {
this.pool=pool;
this.setDaemon(true); // see API doc of Thread#setDaemon
 
V

vjg

Ian said:
Sun's developer online training website has an example of a JDBC
connection pool.
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

One of the things it does is start a "reaper" thread that watches for
stale connections (see below).

If I run my test program from Eclipse, this reaper thread keeps running
when my program has otherwise finished. I didn't notice this to start
with and so after a few test runs Eclipse started reporting that the VM
was out of memory.

I think I need to replace "while(true") below with "while(poolExists)"
and set poolExists to false somehow when my program wants to exit.

The JDCConnectionPool is instantiated by the constructor of
JDCConnectionDriver which I instantiate in my application start-up.

Because the pool is written as a JDBC driver wrapper, there's not much
leverage for the app to force a clean up.

I suppose I could add a finalize() to JDCConnectionDriver and some
methods in JDBCConnectionPool and ConnectionReaper to set poolExists false.

I'm not sure if this is a good way to go about this, ideas?

I'd just set the reaper thread to be a daemon thread before starting
it. That way it will die a natural death when the JVM shuts down (i.e.
when your application closes down normally).
 
D

Daniel Pitts

Ian said:
Sun's developer online training website has an example of a JDBC
connection pool.
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

One of the things it does is start a "reaper" thread that watches for
stale connections (see below).

If I run my test program from Eclipse, this reaper thread keeps running
when my program has otherwise finished. I didn't notice this to start
with and so after a few test runs Eclipse started reporting that the VM
was out of memory.
Once your application has terminated, no threads should be left
running.
You might have to ask Eclipse to forcefully terminate the child
process. If the process has completed, but your problem persists, it
would seem to be a bug with Eclipse, rather than your code.

All threads should terminate when Systen.exit() is called. Otherwise,
if only Daemon threads (see Thread.setDaemon) are active, the JVM
should quit.
 
I

Ian Wilson

Ian said:
Sun's developer online training website has an example of a JDBC
connection pool.
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

One of the things it does is start a "reaper" thread that watches for
stale connections (see below).

If I run my test program from Eclipse, this reaper thread keeps running
when my program has otherwise finished.

Adding setDaemon(true) to the thread's constructor had the desired
effect. So simple!

Thanks Thomas, vjg, Daniel.
 

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

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top