我知道LockSupport是JDK的一部分,但我想知道下面的实现是否在语义上是正确的。注意到Object.wait可以处理线程中断的问题。我的问题不在于绩效;但是,只要您的解决方案仅使用基本构造(如wait,notify和synchronized),我将不胜感激任何改进我的解决方案的建议。
非常感谢。
final class LockSupport {
static void park(long time) {
Thread th = Thread.currentThread();
if (th instanceof MyThread) {
MyThread h = (MyThread)th;
synchronized (h.obj) {
if (h.permit) {
h.permit = false;
return;
}
try {
h.obj.wait(time);
} catch (InterruptedException e) { }
}
}
}
static void unpark(MyThread h) {
synchronized (h.obj) {
h.permit = true;
h.obj.notify();
}
}
}
abstract class MyThread extends Thread {
public Object obj = new Object();
public boolean permit = true;
}
答案 0 :(得分:2)
初始许可证应该是假的。
当捕获到中断时,您需要重新中断当前线程
catch (InterruptedException e) { th.interrupt(); }
因为如果park()
因中断而返回,则应设置中断状态(参见javadoc示例)
wait()
完成后,正常或突然因中断而消耗许可证。
在unpark()
中,如果许可已经存在,则无需通知。