I have two threads that want to synchonize on the same object. Thead A needs to be able to interrupt Thread B if a certain condition has been fullfilled. Here is some pseudo-code of what the two threads do/should do.
A:
public void run()
{
while(true)
{
//Do stuff
synchronized(shared)
{
//Do more stuff
if(condition)
{
B.interrupt();
}
}
}
}
B:
public void run()
{
while(true)
{
try
{
//Do stuff
synchronized(shared)
{
//Do more stuff
}
}
catch(InterruptedException e)
{
continue;
}
}
}
Here’s the situation I can’t resolve:
- Thread
Agrabs the shared resource and does some stuff. - Meanwhile, Thread
Breaches the synchronized block, and awaits forAto release its shared resource. - Thread
A, while doing stuff, realized that Thread B should not have the shared resource, and tries to interrupt ThreadB. But ThreadBhas already surpassed the points where anInterruptedExceptioncould be thrown.
My question is, is there any way to interrupt a thread while it is waiting to be synchronized on something?
For this kind of thing, you should use the classes in
java.util.concurrent.locks– they have far more capabilities, including interruptable locks.Edit: If you cannot use those classes, then look at jkff’s answer – your requirements can be met with the
wait()/notify()mechnism, but it’s easy to introduce subtle bugs.