Я пытаюсь установить Maximum Waiting Time
внутри моего PQueue
. Это Maximum Waiting Time
будет проверять мой PQueue
автоматически, если есть links
, ждущие более Maximum Waiting Time
, чтобы удалить его. Я сделал это, изменив мой код, он работает, но он останавливается именно после удаления ссылок. Я хочу удалить все элементы из моего PQueue
в соответствии с условием ожидания. Можете ли вы рассказать мне, что мне здесь не хватает?Как удалить элементы из PriorityQueue в соответствии с свойством Element?
Это мой класс:
public class MyClass {
public static PriorityQueue <LinkNodeLight> PQueue = new PriorityQueue <>();
private static Set<String> DuplicationLinksHub = new LinkedHashSet <>();
private static Integer IntraLinkCount = new Integer (0);
private static Integer InterLinkCount = new Integer (0);
private static Integer DuplicationLinksCount = new Integer (0);
private static Integer MaxWaitTime = new Integer (60000); // 1 M= 60000 MS
@SuppressWarnings("null")
LinkNode deque(){
LinkNode link = null;
synchronized (PQueue) {
link = (LinkNode) PQueue.poll();
if (link != null) {
link.setDequeTime(new DateTime());
if (link.isInterLinks())
synchronized (InterLinkCount) {
InterLinkCount--;
}
else
synchronized (IntraLinkCount) {
IntraLinkCount--;
}
}
synchronized (PQueue) {
if (link.waitingInQueue()>MaxWaitTime) {
link = (LinkNode) PQueue.remove();
System.out.println("*********************************");
System.out.println("This Link is Deopped: " + link);
System.out.println("%%% MaX Waiting Time:" + (MaxWaitTime/60000)+"Min");
System.out.println("*********************************");
}
}
return link;
}
Не просмотрел весь код, но синхронизация на 'InterLinkCount' или' IntraLinkCount' не работает. Вы продолжаете изменять объект, к которому относятся эти переменные, поэтому разные потоки не получают одинаковые блокировки. – user2357112
@ user2357112 это не весь мой проект, так как это большая программа. Это часть его. Я могу предоставить другие процедуры, касающиеся кода, если это необходимо – medo0070
Общий комментарий: не используйте 'new Integer (n)', вместо этого используйте 'Integer.valueOf (n)'. Это намного эффективнее. – Tomas