如何在Java中中断同步语句?

时间:2010-02-21 13:47:43

标签: java multithreading interrupt synchronized

我有两个想要在同一个对象上同步的线程。如果某个条件已满,则Thead A需要能够中断线程B。这是两个线程应该做/应该做的一些伪代码。

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;
        }
    }
}

以下是我无法解决的情况:

  • 线程A抓取共享资源并执行一些操作。
  • 同时,线程B到达同步块,等待A释放其共享资源。
  • 线程A在执行操作时意识到线程B不应该拥有共享资源,并尝试中断线程B。但是线程B已经超过了可以抛出InterruptedException的点。

我的问题是,是否有任何方法可以在线程等待synchronized某事时中断线程?

3 个答案:

答案 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指令,可以被中断。