Yudong Li
Yudong Li

Reputation: 1784

Kill an object in java

I am currently using JMX to manage and monitor a huge migration process which is executed within a Java class.

I would like to be able to abort and kill the process when I needed, e.g. customer/time required, or some dead loop happens within a single migration.

Here, we call abort a gracefully way to kill a thread by setting up a boolean flag and once every loop will check the flag first and then decides whether to proceed or not. This has been implemented without any issue.

However, I am having troubles with kill the thread. My colleague had suggested me to override the finalize() method and try to kill it within it. However, what I have found online is this method will not be able to destroy the object and it is recommned to be called by GC but the user instead.

I guess the theory is OK that as long as the object is destroyed, no more process will be able to happen. I am just not sure whether this is able to be implemented in JAVA or not.

Also, I would like to know, is there any other ways that you guys can give me a hint.

Would be very appreciate your help.

P.S: by relating to JMX, doesn't mean it really has to do with JMX, it just I would like this killing command is coming from the JMX console client.

Upvotes: 1

Views: 2777

Answers (2)

Stephen C
Stephen C

Reputation: 719238

It's a bit hard to understand what you are saying, but I don't think that finalize is going to be any help.

  • A live thread (i.e. one that has been started and has not yet terminated) is reachable by definition, and therefore won't be garbage collected. So adding a finalize method to it won't have any affect.

  • If the object you are talking about is not the thread, adding a finalize probably won't help either:

    • If the thread's runnable (or whatever) has a reference to the object, that will stop it from being garbage collected.
    • If it doesn't, and the object does become unreachable, the finalize method won't run until after the GC has decided to collect the object ... and that may never happen.
    • Even if the finalize method did get called, what could it do? You've already told the thread to shut down ... and nothing has happened.

The real problem here seems to be that the thread is not responding to your "graceful shutdown" flag.

  • I'd try to fix this by using Thread.interrupt() and Thread.isInterrupted() rather than a custom flag. This has the advantage that an interrupt will also unblock things like Thread.sleep Object.wait and certain I/O operations.

  • If the thread is blocked trying to talk to some external service via a socket or pipe, you could unblock it by closing the socket and/or stream. This of course assumes that your shutdown code can get its hands on the reference to the Socket or Stream object.

  • If those approaches failed, I'd consider pulling the plug on the entire application by calling System.exit() ... if that's a reasonable thing to do.

  • If you are totally desperate (and a little bit insane) you could consider using the deprecated Thread.abort() method. But there is a distinct possibility that that would leave your entire application in a broken and unresponsive state. So I would NOT recommend this approach.

The other possibilities to consider are:

  • that the Thread has actually responded and exited, but your shutdown code didn't notice,
  • that the Thread died before you tried to shut it down it, and your shutdown code didn't notice,
  • that the Thread is deadlocked, or
  • that there is some long running (but not infinite) loop in the runnable needs to be modified to check the "you die now" flag more often.

Some of these things you could be diagnosed by attaching a debugger and taking a thread dump.


I think you said that you saw advice to the effect that it was a BAD IDEA to call System.gc(). This is good advice.

Upvotes: 2

Hardik Mishra
Hardik Mishra

Reputation: 14887

You should perform certain task in finally which you want to perform when method exits in any condition. Most preferable example people give about this is cosing database connection.

Yes it is recommended to leave Garbage Collection on JVM.

JVM takes care of destrying objects.

Upvotes: 0

Related Questions