我有两个想要在同一个对象上同步的线程。如果某个条件已满,则Thead A
需要能够中断线程B
。这是两个线程应该做/应该做的一些伪代码。
public void run()
{
while(true)
{
//Do stuff
synchronized(shared)
{
//Do more stuff
if(condition)
{
B.interrupt();
}
}
}
}
public void run()
{
while(true)
{
try
{
//Do stuff
synchronized(shared)
{
//Do more stuff
}
}
catch(InterruptedException e)
{
continue;
}
}
}
以下是我无法解决的情况:
A
抓取共享资源并执行一些操作。B
到达同步块,等待A
释放其共享资源。A
在执行操作时意识到线程B不应该拥有共享资源,并尝试中断线程B
。但是线程B
已经超过了可以抛出InterruptedException
的点。我的问题是,是否有任何方法可以在线程等待synchronized
某事时中断线程?
答案 0 :(得分:5)
对于这类事情,您应该使用java.util.concurrent.locks
中的类 - 它们具有更多功能,包括可中断锁定。
编辑:如果您不能使用这些课程,请查看jkff的答案 - 您的要求可以通过wait()
/ notify()
机制来满足,但很容易介绍微妙的错误。
答案 1 :(得分:2)
确实你应该使用锁或用Object.wait()
,Object.notify()
和Object.notifyAll()
方法实现你的东西(实际上用它们实现了锁)。不要忘记处理所谓的“虚假唤醒”(wait()
可能会返回,即使没有人调用notify()
或notifyAll()
,所以应始终在循环中调用它来检查你等待的条件是满意的。)
答案 2 :(得分:1)
不,但ReentrantLock.lockInterruptibly()
的行为类似于原始monitorenter
指令,可以被中断。