在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()
}
}
}
);