Java中如何中断同步语句?
-
21-09-2019 - |
题
我有两个线程想要在同一个对象上同步。头 A
需要能够中断线程 B
如果满足了某个条件。这是两个线程做什么/应该做什么的一些伪代码。
A:
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
在某事上?
解决方案
对于这种事情,您应该使用中的类 java.util.concurrent.locks
- 它们具有更多的功能,包括可中断锁。
编辑: 如果你不能使用这些类,那么看看 jkff 的答案 - 你的要求可以满足 wait()
/notify()
机制,但很容易引入微妙的错误。
其他提示
事实上,你应该使用锁或用 Object.wait()
, Object.notify()
和 Object.notifyAll()
方法(锁实际上是用它们实现的)。不要忘记处理所谓的“虚假唤醒”(wait()
即使没有人打电话也可能会返回 notify()
或者 notifyAll()
, ,因此应该始终在循环中调用它来检查您正在等待的条件是否得到满足)。
不是,但 ReentrantLock.lockInterruptically()
行为类似于原始 monitorenter
指令并且可以被中断。
不隶属于 StackOverflow