我有一段代码在特定条件下等待Class锁,在执行了一些操作之后,我对该Class锁执行了通知。
但是,只要有一个线程等待它跳过以下代码并退出执行,我都会记录我的代码的详细信息。
我想了解这里出了什么问题:(
如果您能在下面的代码中提出一些可以解决的建议,那也很好
下面是我的代码供参考
TroubleTicketRequestManagement:
public class TroubleTicketRequestManagement {
private static Logger logger = Logger.getLogger(TroubleTicketRequestManagement.class);
public SimpleactionResponse addRequestToPool(int docketNo) throws InterruptedException {
logger.info("addRequestToPool started with Docket No : " + docketNo);
SimpleactionResponse response = new SimpleactionResponse();
RequestSynchronization requestSynchronization = new RequestSynchronization(docketNo);
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
try {
RequestSynchronization.synchronizeRequests(requestSynchronization);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
threadOne.start();
return response;
}
public SimpleactionResponse removeRequestFromPool(int docketNo) throws InterruptedException {
logger.info("removeRequestFromPool started with Docket No : " + docketNo);
SimpleactionResponse response = new SimpleactionResponse();
RequestSynchronization requestSynchronization = new RequestSynchronization(docketNo);
Thread threadTwo = new Thread(new Runnable() {
@Override
public void run() {
try {
RequestSynchronization.removeRequests(requestSynchronization);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
threadTwo.start();
return response;
}
}
RequestSynchronization:
public class RequestSynchronization {
private static Logger logger = Logger.getLogger(RequestSynchronization.class);
private static Set<Integer> set = new HashSet<Integer>();
private final static Object lock = new Object();
private static volatile int currentDocketId = -1;
private int docketNo;
public int getDocketNo() {
return docketNo;
}
public RequestSynchronization(int docketNo) {
super();
this.docketNo = docketNo;
}
public synchronized static void synchronizeRequests(RequestSynchronization requestSynchronization)
throws InterruptedException {
currentDocketId = requestSynchronization.getDocketNo();
while (set.contains(currentDocketId)) {
logger.info("Before Notify");
RequestSynchronization.class.wait();
logger.info("After Notify");
}
set.add(currentDocketId);
}
public synchronized static void removeRequests(RequestSynchronization requestSynchronization)
throws InterruptedException {
currentDocketId = requestSynchronization.getDocketNo();
set.remove(requestSynchronization.getDocketNo());
RequestSynchronization.class.notifyAll();
}
}
摘要:我要执行的操作是,如果请求的ID与先前的处理请求的ID相同,则使请求等待。一旦先前的请求完成执行,它将调用Notify。
PS:可以同时创建多个线程
提前谢谢