Ich versuche Maximum Waiting Time
in meinem PQueue
zu setzen. Diese Maximum Waiting Time
wird automatisch überprüfen, PQueue
, wenn es links
warten mehr als Maximum Waiting Time
, um es zu entfernen. Ich habe diese Änderungen an meinem Code es funktioniert, aber es stoppt genau nach dem Entfernen der Links. Ich möchte alle Elemente aus meinem PQueue
je nach Wartezeit entfernen. Kannst du mir sagen, was ich hier vermisse?Wie Elemente aus PriorityQueue nach einer Elementeigenschaft entfernen?
Das ist meine Klasse:
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;
}
Haben nicht sah durch den gesamten Code, aber die Synchronisierung auf "InterLinkCount" oder "IntraLinkCount" funktioniert nicht. Sie ändern ständig, auf welches Objekt sich diese Variablen beziehen, sodass verschiedene Threads nicht die gleichen Sperren erhalten. – user2357112
@ user2357112 das ist nicht mein ganzes Projekt, da es ein großes Programm ist. Dies ist ein Teil davon. Ich kann bei Bedarf andere Prozeduren bezüglich des Codes bereitstellen – medo0070
Ein genereller Kommentar: Verwenden Sie nicht 'new Integer (n)', sondern verwenden Sie 'Integer.valueOf (n)'. Es ist viel effizienter. – Tomas