Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中中断同步语句?_Java_Multithreading_Interrupt_Synchronized - Fatal编程技术网

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

如何在Java中中断同步语句?,java,multithreading,interrupt,synchronized,Java,Multithreading,Interrupt,Synchronized,我有两个线程要在同一个对象上同步。如果某个条件已满,ADA需要能够中断线程B。下面是两个线程所做/应该做的一些伪代码 A: B: 以下是我无法解决的情况: 线程A获取共享资源并执行一些操作 同时,线程B到达同步块,并等待A释放其共享资源 线程A,在执行任务时,意识到线程B不应该拥有共享资源,并尝试中断线程B。但是线程B已经超过了可以抛出中断异常的点 我的问题是,有没有办法在线程等待同步时中断它?对于这种情况,您应该使用中的类-它们有更多的功能,包括可中断的锁 编辑:如果你不能使用这些类,那么

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

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

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

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

对于这种情况,您应该使用中的类-它们有更多的功能,包括可中断的锁


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

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

否,但是
的行为与原语
monitorenter
指令类似,并且可以被中断。

我担心这可能是解决方案:我正在使用Java的一个子集,默认情况下没有这些类。它们是纯Java(在这种情况下,我可以包括它们),还是需要本机库(不允许)?这是纯Java,在Java1中引入。5@Eric,什么子集?是j2me吗?@finnw:不是。我正在使用LeJOS NXJ,一种用于乐高Mindstorms NXT微控制器的Java语言。如果有帮助的话,这里有一个用于JVM的Java.util.concurrent的后端口,没有它:(我不知道它是否能与您的兼容)
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;
        }
    }
}