繁体   English   中英

停止线程并释放Java中的锁

[英]Stop a thread and release the lock in Java

我有一个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可以做到吗?

您可以使用线程中断机制 如果要在获取LOCK中断,则应使用LOCK.lockInterruptibly()而不是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()
      }
    }
  }
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM