- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我尝试在我的 PQueue
中设置 Maximum Waiting Time
。如果有任何链接
等待超过Maximum Waiting Time
,这个Maximum Waiting Time
会自动检查我的PQueue
去掉它。我对我的代码进行了此更改,它正在运行,但它在删除链接后正好停止。我想根据等待时间条件从我的 PQueue
中删除所有元素。你能告诉我这里缺少什么吗?
这是我的课:
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;
}
最佳答案
你的问题有点不透明,但如果我理解正确的话,你想检查你的 PriorityQueue
看看是否有等待时间超过特定时间的项目。
如前所述,您对 IntraLinkCount
和 InterLinkCount
的 synchronized
使用有点奇怪。有一个相当未知的替代方案,原子整数类 AtomicInteger
(在包 java.util.concurrent.atomic
中:
private static AtomicInteger IntraLinkCount = Integer.valueOf(0);
这将如您所愿。
第二个问题是您使用了poll()
方法。这将从队列中删除 顶部项目。也许您想改用 peek()
,然后仅在返回的链接对象满足 link.waitingInQueue() > MaxWaitTime
时才使用 remove()
>?
顺便说一句,您的队列将根据它们的“自然顺序”返回项目。这意味着使用了 compareTo
方法,“最小的”将首先从队列中返回。我认为您可能想要实现一个自定义的 compareTo
,将 最长等待 链接放在第一位?
你也可以 create your PriorityQueue
with a custom Comparator
对象代替。
像这样:
public class MyClass {
public static PriorityQueue<LinkNodeLight> PQueue = new PriorityQueue<>();
private static AtomicInteger IntraLinkCount = new AtomicInteger(0);
private static AtomicInteger InterLinkCount = new AtomicInteger(0);
private static Integer MaxWaitTime = Integer.valueOf(60_000); // 1 M= 60000 MS
LinkNode deque() {
LinkNode link = null;
synchronized (PQueue) {
link = PQueue.peek();
if (link != null) {
link.setDequeTime(LocalDateTime.now());
if (link.isInterLinks())
InterLinkCount.decrementAndGet();
else
IntraLinkCount.decrementAndGet();
if (link.waitingInQueue() > MaxWaitTime) {
link = 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;
} else
return null;
}
}
return link; // Not sure what you want to return here
}
}
如果你有幸使用 Java 8,像这样的魔法可能会有用:
synchronized (PQueue) {
link = PQueue.stream().filter(node -> node.waitingInQueue() > MaxWaitTime).findFirst().orElse(null);
if (link != null)
PQueue.remove(link);
}
关于java - 如何根据元素属性从 PriorityQueue 中删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33301146/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!