在Java中停止线程并释放锁

在Java中停止线程并释放锁,java,multithreading,Java,Multithreading,我有一个ServerState对象: public class ServerState { public static final LOCK = new ReentrantLock(); public static Map<String, Object> states = new HashMap<>(); } 我的问题是:当线程A获得了锁并且正在做一些肮脏的工作时,线程B希望立即终止A,但希望它在终止前释放锁,我如何实现这一点?我不希望使用标志来指示线程

我有一个
ServerState
对象:

public class ServerState {
    public static final LOCK = new ReentrantLock();
    public static Map<String, Object> states = new HashMap<>();
}
我的问题是:当线程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.lockinterruptbly()
而不是
LOCK.LOCK()

然后,要停止
thread1
只需调用

thread1.interrupt();
从另一个线程

我还建议将实际逻辑从
线程
移动到
可运行

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

Put
ServerState.LOCK.unlock()
最后
块中。请参阅示例。您想在线程A执行脏工作时终止线程A并释放锁吗?@DavidSchwartz是的,这正是我想做的。@DiLuo那么持有锁有什么意义?如果你不打算修改状态,为什么要保持锁定?@DavidSchwartz噢,很抱歉丢失了信息。实际上,在脏工作期间,线程正在修改共享状态。
thread1.interrupt();
Thread thread1 = new Thread(
  new Runnable() {
    @Override
    void run() {
      try {
        LOCK.lockInterruptibly();
        System.out.println("work");
        LOCK.unlock();
      } catch (InterruptedException ier) {
        Thread.currentThread().interrupt()
      }
    }
  }
);