我有两个线程想要在同一个对象上同步。头 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 指令并且可以被中断。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top