线程如何放弃等待并抛出异常

4

情况是有两个线程在等待某个事件,它们互相等待而导致了死锁。在这种情况下,我希望其中一个线程放弃等待并抛出异常,以便另一个线程可以继续执行任务。从逻辑上讲,我可以这样做,但是否有其他方法来实现这个任务呢?
我已经做了以下工作:

boolean flag=true;
run(){
    synchronized(this){
    if(flag){
        boolean flag=false;
        wait(1500);
    }else{
        throw new Exception();
    }


    }
}

更多描述:

例如,线程A想要在客户表中添加新客户(客户A),但他发现线程B已经开始了这个过程,所以线程A正在等待线程B完成(因为在另一个表中需要客户ID作为外键)。

线程B虽然已经完成了对客户A的插入,但它需要插入一些新的城市详细信息以插入到城市表中,但由于此过程已被线程A启动,所以它正在等待。

两个线程都在等待彼此完成。


5
祝你好运解决死锁问题。 - Sotirios Delimanolis
你没有死锁。你只是有一个wait调用,但是没有可识别的条件在等待。通常情况下,另一个线程会调用notify来允许wait结束,但这必须与可检查的条件相结合,等待线程必须检查(并在wait后重新检查),并且通知线程必须更改为已满足。唯一看起来像条件的是你的boolean标志,但由于等待线程在等待之前自己修改了该标志,所以这一切都没有意义。 - Holger
@user3608352:所以你的意思是你发布的代码并不是你真正尝试过的?那么,你发布那些无用的代码的目的是什么? - Holger
@Holger 代码是我问题的关键部分,如果您不理解代码,可以问我更多问题,而不是宣称它是无意义的。 - user3608352
@user3608352:我已经解释了你代码中的问题。如果你拒绝处理,就没有人能帮助你了。 - Holger
显示剩余5条评论
1个回答

0
避免所有严格的死锁的方法是始终以相同的顺序声明相同的锁。在您的示例中,两个线程都应该首先更新City表,然后是User表,或者它们都可以以另一种方式执行。这样就不可能出现死锁。

感谢您宝贵的意见。但这只是一个样例场景,在实际场景中,我无法维护顺序,例如客户A可能有其他客户C(因此需要递归调用该客户),而客户B则没有任何其他客户。 - user3608352
2
没关系。检测和恢复死锁非常困难。避免它们可能需要对您的应用程序进行一些重新组织,但这绝对是正确的解决方案。只需将其视为要求,并相应地编写代码。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接