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