Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / April 2007

Tip: Looking for answers? Try searching our database.

Destroying a Thread

Thread view: 
Jason Cavett - 03 Apr 2007 18:42 GMT
This question is a follow-up to:
http://groups.google.com/group/comp.lang.java.programmer/browse_frm/thread/28d34
8f31e4d3ed7/
#

I am using the BlockingQueue as suggested in my first post.  It works
great (well, still not sure about a few things, but I'm trying to
figure them out).  I did figure out that, if I want to stop the
thread, the best way is to return from the run method, so I have
something like this:

/**
* @see java.lang.Runnable#run()
*/
public void run() {
 while (true) {
  try {
   File file = queue.take();

   // check to see if the queue has been poisoned
   if (file.equals(FileWorker.POISON_FILE)) {
    break;
   } else {
    this.processFile(file);
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }

 return;
}

That way, if I close down the project, I can put a File object in the
queue that lets the thread know that it is finished (AKA, the project
has closed).  (I clear the queue first so that the poison object will
be the only object left in the queue.)

The problem I am having is this - if a process is already running, I
don't really have any way of interrupting it (which I want to do if
the user is closing down the project because I don't want the very
processor intensive process running in the background while they
continue to work).

Any suggestions for stopping a process?  (This would also be helpful
because I want to allow the user to choose to cancel a process that
they have already started.)

Thanks
Knute Johnson - 03 Apr 2007 18:52 GMT
> This question is a follow-up to:
> http://groups.google.com/group/comp.lang.java.programmer/browse_frm/thread/28d34
8f31e4d3ed7/
#
[quoted text clipped - 43 lines]
>
> Thanks

public void run() {
    try {
        while (true) {
            ????.take();
        }
    } catch (InterruptedException ie) { }
}

Just interrupt the thread.  take() throws an InterruptedException if it
is interrupted while waiting.

Signature

Knute Johnson
email s/nospam/knute/

Jason Cavett - 03 Apr 2007 19:14 GMT
On Apr 3, 1:52 pm, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> > This question is a follow-up to:
> >http://groups.google.com/group/comp.lang.java.programmer/browse_frm/t...
[quoted text clipped - 62 lines]
>
> - Show quoted text -

But what if I made it to this line...

this.processFile(file);

And now I'm doing the processing of the file (which can take quite a
long time - 10 minutes or more) and I want to interrupt that
processing?  That's what I'm curious about.  I already know how to
stop the thread if the queue is in waiting state.
Knute Johnson - 03 Apr 2007 22:20 GMT
> On Apr 3, 1:52 pm, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> wrote:
[quoted text clipped - 64 lines]
> processing?  That's what I'm curious about.  I already know how to
> stop the thread if the queue is in waiting state.

You need some sort of test or exception capture in processFile().  If
you have the source just check a flag or use the Thread.interrupted() to
test.  If you don't have the source to processFile() then it may be
possible to make the run method use a daemon thread and close your
program to stop it.

Signature

Knute Johnson
email s/nospam/knute/

Tom Hawtin - 03 Apr 2007 18:53 GMT
> The problem I am having is this - if a process is already running, I
> don't really have any way of interrupting it (which I want to do if
> the user is closing down the project because I don't want the very
> processor intensive process running in the background while they
> continue to work).

I suggest just checking a flag periodically.

You can use Thread.interrupt which should interrupt I/O and any waits.
However, interruptible I/O has been quietly deprecated and interrupts
are more often than not handled incorrectly. Interrupting a thread that
is loading a class can be a bad move (the class may fail to load, and
therefore becomes completely unloadable with that class loader).

Tom Hawtin


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.