当前位置: 首页 > 知识库问答 >
问题:

找出哪个线程当前拥有锁,这样我就可以杀死它

从开济
2023-03-14

我需要找出哪个线程当前拥有锁。

我正在使用线程池编写一个托管独立应用程序实例的多线程服务器。当关闭应用程序实例时,我调用监控器。TryEnter获取锁或超时。如果超时发生,我需要获取哪个线程拥有锁,以便我可以中止它。

如果应用程序中没有bug,我将永远不需要这样做,因为每个工作人员都会在进入和退出应用程序时锁定和解锁应用程序实例。但是,如果有一个bug,无论出于何种原因,工作人员没有退出,或者处于死锁状态,或者陷入无休止的循环中,我希望能够杀死该线程和应用程序实例,同时让服务器的其余部分继续运行。此时的应用程序实例是一个失败的原因。

似乎是一个非常直接的要求,但找不到任何内置的东西来实现它。

一种解决方法是在与锁相同的上下文中添加一个线程成员,并让每个线程在获取锁时更新它。但这取决于每个人在获得锁时总是记得更新它。

共有1个答案

弘兴言
2023-03-14

你认为线程控制是一个自上而下的层次结构,但在多线程应用程序中,这不是正确的思维方式。如果线程在执行过程中出现超时或其他问题,线程本身必须负责释放锁并结束自己。

 类似资料:
  • 问题内容: 是否可以在不设置/检查任何标志/信号灯/等的情况下终止正在运行的线程? 问题答案: 在Python和任何语言中,突然终止线程通常都是一种糟糕的模式。请考虑以下情况: 线程持有必须正确关闭的关键资源 该线程创建了其他几个必须同时终止的线程。 如果你负担得起的话(如果你要管理自己的线程),处理此问题的一种好方法是有一个标志,每个线程定期检查一次,以查看是否该退出。 例如: 在此代码中,你应

  • 问题内容: 当Linux内存不足(OOM)耗尽时,OOM杀手根据一些启发式方法选择一个要杀死的进程(这很有趣: http //lwn.net/Articles/317814/)。 如何以 编程方式 确定OOM杀手最近杀死了哪些进程? 问题答案: 试试看:

  • 问题内容: 我有一个LockManager来管理多个线程的锁。有时线程是坏男孩,我必须杀死它们并要求LockManager释放所有锁。但是,由于我无法在Java中使用ReentrantLock,因此无法解锁另一个线程拥有的锁。 我被迫使用锁(不能使用信号灯,这是作业的重点)。是否有任何Java Lock实现可让我解锁其他线程拥有的锁? 到目前为止,我考虑的选项是: 以允许我执行此操作的方式重新实现

  • 我有一个LockManager管理几个线程的锁。有时线程是坏男孩,我必须杀死他们,并要求锁经理释放他们所有的锁。但是,由于我在java中使用ReentrantLock,这是不可能的,我不能解锁另一个线程拥有的锁。 我被迫使用锁(不能使用信号量,这是作业的重点)。是否有Java锁实现允许我解锁其他线程拥有的锁? 到目前为止,我考虑的选择是: null 可重入锁-从另一个线程解锁 从不拥有锁的线程中解

  • 我想使用执行器接口(使用Callable),以便启动一个线程(让我们称之为可调用线程),它将执行使用阻塞方法的工作。这意味着当主线程调用Future.cancel(true)(调用Thread.interrupt())时,可调用的线程可以抛出一个InterruptedExc0019。 我还希望我的可调用线程在代码的取消部分使用其他阻塞方法中断时正确终止。 在实现这一点时,我经历了以下行为:当我调用

  • 问题内容: 对于Java对象,有没有办法告诉哪个线程(或null)当前 拥有其监视器?或者至少是一种方法来判断当前线程是否拥有它? 问题答案: 我自己找到了一些答案。要测试当前线程是否拥有 监视器,是否 存在! exists! 这确实非常快(亚微秒),并且从1.4开始就可用。 通常,要测试哪个线程(或线程ID)持有该锁,可以 对 classes (thanks @amicngh). 有一些注意事项