Re: Please help me kill this java thread..... code example
On 11/15/2012 1:56 PM, kedward777@gmail.com wrote:
Thank you again! I think you are right about the a lock on the JVM by the scanner thread.
One key point is that I am also tried setting the "exiting" variable in the shutdown method, which should stop the while loop of the scanner thread... but I don't think the thread is being woken in the shutdown, BUT then when I press the scan trigger, it wakes the thread and it sees that exiting is true, and THEN dies...
private void shutdown(java.awt.event.ActionEvent evt) {
existing=true;
Elsethread you posted code for a launchScanner() method where
`exiting' (not `existing', by the way) is tested:
public synchronized void launchScanner(){
//...
exiting = false;
while (!exiting){
try{
scanner.read(null, this);
wait();
}catch (Exception e){
System.out.println("Got Error: " + e.getMessage());
return;
}
}
//...
We don't know what class this method belongs to, so we don't
know why it's synchronized, nor what object it synchronizes on,
nor what you expect the wait() call to do. Maybe there are answers
and reasons, but the code looks a bit suspect.
You don't show the declaration of `exiting' so we can't tell
whether it's `volatile', which it pretty much needs to be for this
sort of purpose. If it's not `volatile' the test in the `while'
loop might be eliminated entirely.
Even if it *is* `volatile', it won't be tested until after the
scanner.read() and the very peculiar wait() calls both return, so
if you're sitting in one or the other of those setting `exiting'
will have no immediate effect.
System.exit(0);
}
QUESTION: how do I wake the scanner thread from the event thread (shutdown) ... I tried notifyAll(), but I get an exception:
java.lang.IllegalMonitorStateException: current thread not owner
Quite plainly, you have no idea what you're doing. This is not
a shameful state of affairs unless it persists; we all start from a
position of ignorance. But if you don't understand *why* you can't
call notify()/notifyAll() without holding the object's lock, that
also suggests you don't know what they do -- which in turn suggests
that you don't know what wait() does, either. Are you just making
plausible-seeming but random changes in hopes of stumbling upon some
working code? A random walk eventually goes everywhere, but it may
take several lifetimes to get anywhere useful. I think it's time
you read a book or something.
(Long years ago I had a student who approached his programming
tasks the way you seem to be approaching this one: Throw something
together that sort of looks somewhat believable, then start shaking
and kicking and beating it until one test case succeeds. Trouble
was, the work he turned in almost never ran the second test case.
In most programming, *especially* in multi-threaded programming, you
need enough understanding to be able to reason about the code: Just
observing it a few times simply won't do. I think you need to set
about increasing your level of understanding.)
--
Eric Sosman
esosman@comcast-dot-net.invalid