7

我有两个线程想要在同一个对象上同步。如果某个条件已经满足, TheadA需要能够中断 Thread 。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。但是 ThreadB已经超过了InterruptedException可以抛出 an 的点。

我的问题是,有没有办法在线程等待时中断线程synchronized

4

3 回答 3

6

对于这种事情,您应该使用其中的类java.util.concurrent.locks- 它们具有更多功能,包括可中断锁。

编辑:wait()如果您不能使用这些类,请查看 jkff 的答案- /机制可以满足您的要求notify(),但很容易引入细微的错误。

于 2010-02-21T14:01:49.640 回答
3

实际上,您应该使用锁或使用Object.wait(),Object.notify()Object.notifyAll()方法实现您的东西(锁实际上是用它们实现的)。不要忘记处理所谓的“虚假唤醒”(wait()即使没有人调用notify()or也可能返回notifyAll(),因此应始终在循环中调用它以检查您等待的条件是否满足)。

于 2010-02-21T14:27:49.397 回答
1

不,但ReentrantLock.lockInterruptibly()行为类似于原始monitorenter指令并且可以被中断。

于 2010-02-21T14:56:00.080 回答