【问题标题】:How can I interrupt a synchronized statement in Java?如何中断 Java 中的同步语句?
【发布时间】:2010-02-21 13:47:42
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading interrupt synchronized


    【解决方案1】:

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

    编辑:如果你不能使用这些类,那么看看 jkff 的回答 - 你的要求可以通过 wait()/notify() 机制来满足,但是很容易引入细微的错误。

    【讨论】:

    • 我担心这可能是解决方案:我正在使用 Java 的一个子集,默认情况下它没有这些类。它们是纯 Java(在这种情况下我无论如何都可以包含它们),还是它们需要原生库(不可行)?
    • 纯Java,Java 1.5引入
    • @Eric,什么子集?是 j2me 吗?
    • @finnw:不。我正在使用 LeJOS NXJ,一种用于 Lego Mindstorms NXT 微控制器的 Java 语言。
    • 如果它有任何帮助,这里是 java.util.concurrent 的 JVM 没有它的反向移植:backport-jsr166.sourceforge.net/index.php(但我不知道它是否适用于你的)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      不,但@987654321@ 的行为类似于基本的monitorenter 指令并且可以被中断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多