我有一个通用的映射迭代器:类似这样的东西:
class Mapper<F, T> implements Iterator<T> {
private Iterator<F> input;
private Action<F, T> action;
public Mapper(input, action) {...}
public boolean hasNext() {
return input.hasNext();
}
public T next() {
return action.process(input.next());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,假设action.process()可能非常耗时,我希望通过使用多个线程并行处理输入项来获得性能.我想分配一个N个工作线程池,并将项目分配给这些线程进行处理.这应该在"幕后"发生,因此客户端代码只能看到Iterator.代码应避免将输入或输出序列保存在内存中.
为了添加一个扭曲,我想要两个版本的解决方案,一个保留订单(最终迭代器以与输入迭代器相同的顺序交付项目),其中一个不一定保留订单(每个输出项目尽快交付)它是可用的).
我有点工作,但代码似乎令人费解和不可靠,我不相信它正在使用最佳实践.
有关最简单,最可靠的实施方法的建议吗?我正在寻找适用于JDK 6的东西,我想尽可能避免在外部库/框架上引入依赖.
Object.finalize() 在Java 9中已弃用,我想我理解其中的原因,但我很难看到如何替换它.
我有一个名为Configuration的实用程序类,它实际上有一个实例,它拥有应用程序中的所有内容,并持续应用程序的持续时间.它提供的服务之一是记录:在第一次请求记录消息时,创建记录器(由于各种遗留原因,它是我自己的记录器而不是标准记录器),并在Configuration对象的字段中保存引用,并且在应用程序终止时,无论是正常还是异常,我想释放记录器所拥有的任何资源(这是一个黑盒子,因为我的库的用户可以提供他们自己的实现).
目前,这是通过Configuration.finalize()调用方法实现的logger.close().
我应该做什么呢?
我有一个对象的集合,我们称它们为A,B,C,D ......,有些与其他对象相同.如果A和C相等,那么我想用A的引用替换对C的每个引用.这意味着(a)对象C可以被垃圾收集,释放内存,(b)我以后可以使用"=="比较对象代替昂贵的equals()操作.(这些对象很大,equals()操作很慢.)
我的直觉是用一个java.util.Set.当我遇到CI时,可以很容易地看到是否有一个Set等于C 的条目.但是如果有,似乎没有简单的方法来找出该条目是什么,并替换我对现有条目的引用.我错了吗?迭代所有条目以找到匹配的条目显然是非首发.
目前,Set我使用的是a,而不是a ,Map其中值始终与键相同.map.get(C)然后呼叫找到A.这有效,但感觉非常令人费解.有更优雅的方式吗?
我必须运行此命令来将代码修复为xml文件:
java -Xmx5G -cp .:jsoup-1.8.2.jar CheckSyntax test.xml > test2.xml
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误:
Invalid maximum heap size: -Xmx5G
The specified size exceeds the maximum representable size.
Run Code Online (Sandbox Code Playgroud)
我怎样才能使它工作?
我已经实现了(在Java中)一个相当简单的迭代器来返回递归目录结构中文件的名称,并且在大约2300个文件之后它失败了"系统中打开的文件太多"(失败实际上是在尝试加载一个类,但我认为目录列表是罪魁祸首).
迭代器维护的数据结构是一个堆栈,其中包含在每个级别打开的目录的内容.
实际逻辑是相当基本的:
private static class DirectoryIterator implements Iterator<String> {
private Stack<File[]> directories;
private FilenameFilter filter;
private Stack<Integer> positions = new Stack<Integer>();
private boolean recurse;
private String next = null;
public DirectoryIterator(Stack<File[]> directories, boolean recurse, FilenameFilter filter) {
this.directories = directories;
this.recurse = recurse;
this.filter = filter;
positions.push(0);
advance();
}
public boolean hasNext() {
return next != null;
}
public String next() {
String s = next;
advance();
return s;
}
public void remove() {
throw new UnsupportedOperationException();
}
private …Run Code Online (Sandbox Code Playgroud) 是否可以实现一个一旦有答案就停止处理流的收集器?
例如,如果收集器正在计算平均值,并且其中一个值是 NaN,我知道答案将是 NaN,而不会看到更多值,因此进一步的计算是没有意义的。
我在com.google.gwt.dom.client.Element类上看不到任何允许我获取元素节点的所有属性的方法.我错过了什么吗?
据推测,我可以通过删除本机代码来获取底层Javascript对象的属性数组?我知道结果依赖于浏览器,但似乎已知有相关的解决方法.我没有潜入本机JS,所以如果有人能告诉我如何做,那将是一个奖励.
这是我以前在其他环境中使用其他分析工具时所看到的,但在这种情况下它尤其引人注目.
我正在运行一个运行大约12分钟的任务的CPU配置文件,并且它显示了几乎一半的时间花费在一个字面上什么都不做的方法:它有一个空体.是什么导致这个?我不相信这种方法被称为荒谬的次数,当然不会占用执行时间的一半.
对于它的价值,所讨论的方法称为startContent(),它用于通知解析事件.事件沿着一系列过滤器传递(可能是十几个),并且每个过滤器上的startContent()方法除了在链中的下一个过滤器上调用startContent()之外几乎没有任何作用.
这是纯Java代码,我在Mac上运行它.
附件是CPU采样器输出的屏幕截图:

这是一个显示调用堆栈的示例:

(因休假而延误)以下是一些显示探查器输出的图片.这些数字远远超出我期望的配置文件的样子.探查器输出似乎完全有意义,而采样器输出是虚假的.

正如你们中的一些人已经猜到的那样,有问题的工作是Saxon XML模式验证器的运行(在9Gb输入文件上).该配置文件显示大约一半的时间用于验证元素内容与简单类型(在endElement处理期间发生),大约一半用于测试关键约束的唯一性; 两个探查器视图显示了该任务的这两个方面所涉及的活动.
我无法提供来自客户端的数据.
我刚刚注意到的一种好奇心,而不是一个问题.
我不被允许写
public boolean x() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
或这个:
public boolean x() {
if (DEBUG) {
return true;
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但我被允许写
public boolean x() {
return DEBUG ? true : null;
}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?(如果采用"else"分支,它似乎会抛出NPE.)
我有一组项目和一个比较器函数,它定义了部分排序——给定两个项目,它返回“=”、“<”、“>”或“没有定义的排序”(比如“<>”)。我想生成一个尊重这种部分排序的项目的排序列表。
如果我寻找算法来进行拓扑排序,它们通常从有向无环图开始。但是我没有 DAG,而且我看不到一种简单的方法来构造一个而不进行大量(也许是 N*N?)的比较。我想要的是某种类似 QuickSort 的算法,它通过比较和交换列表中的选定项目来工作。有这样的算法吗?我假设大多数经典排序算法都会因为不确定性而失败。
我想尝试使用经典的排序算法并将“<>”视为“=”,但它不起作用,因为我可以遇到 A < B、A <> C、B <> C,所以我可以'不要将 C 视为等于 A 和 B。
任何想法或指示?
java ×7
algorithm ×1
collections ×1
finalizer ×1
gwt ×1
java-8 ×1
java-9 ×1
java-stream ×1
performance ×1
sorting ×1
visualvm ×1