java - Java中停止线程并释放锁

标签 java multithreading

我有一个ServerState对象:

public class ServerState {
    public static final LOCK = new ReentrantLock();
    public static Map<String, Object> states = new HashMap<>();
}

线程A:

public class ThreadA extends Thread {
    @Override
    public void run() {
        ServerState.LOCK.lock();
        // do some dirty work
        ServerState.LOCK.unlock();
    }
}

我的问题是:当线程A获取了锁并且正在做一些脏工作时,线程B想要立即终止A,但又希望它在终止之前释放锁,我该如何实现这一点?我不是在寻找使用标志来指示线程是否像这样终止:

public class ThreadA extends Thread {
    volatile boolean isFinished = false;
    @Override
    public void run() {
        while (!isFinished) {
            ServerState.LOCK.lock();
            // do some dirty work
            ServerState.LOCK.unlock();
        }
}

我想要实现的是终止线程并释放锁而不继续下一次迭代。可以用 Java 实现吗?

最佳答案

您可以使用线程interruption mechanism 。 如果您想在 LOCK 获取时中断,则应使用 LOCK.lockInterruptically() 而不是 LOCK.lock():

Thread thread1 = new Thread() {
  @Override
  void run() {
    try {
      LOCK.lockInterruptibly();
      System.out.println("work");
      LOCK.unlock();
    } catch (InterruptedException ier) {
      this.interrupt()
    }
  }
};

然后,要停止 thread1 只需调用

thread1.interrupt();

来自另一个线程。

此外,我建议将实际逻辑从Thread移动到Runnable:

Thread thread1 = new Thread(
  new Runnable() {
    @Override
    void run() {
      try {
        LOCK.lockInterruptibly();
        System.out.println("work");
        LOCK.unlock();
      } catch (InterruptedException ier) {
        Thread.currentThread().interrupt()
      }
    }
  }
);

关于java - Java中停止线程并释放锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51679921/

相关文章:

java - 为什么要费心使用 ArrayList(int capacity)?

wpf - 如何在 Dispatcher 中访问 WPF 对象?

java - 无法模拟 Executors.newSingleThreadExecutor() 并调用真正的方法

multithreading - 轻量级进程和线程有什么区别?

c - C 中线程特定数据的示例

python - 为什么Python线程一旦完成就不能再次运行?

java - Java中方法名前的下划线是什么意思?

java - 更新 SQLite 数据库中的行会创建重复行

java - 在 WebLogic 上添加服务器启动参数 -DUseSunHttpHandler=true

java - makeHttpRequest 崩溃