注意:我已经在另一个SO帖子中解决了这个问题 - 在嵌套的Java 8并行流动作中使用信号量可能是DEADLOCK.这是一个错误吗? - 但是这篇文章的标题表明问题与使用信号量有关 - 这有点分散了讨论的注意力.我正在创建这个,以强调嵌套循环可能有性能问题 - 虽然这两个问题可能是一个共同的原因(也许是因为我花了很多时间来弄清楚这个问题).(我不认为它是重复的,因为它强调另一种症状 - 但如果你只是删除它).
问题:如果嵌套两个Java 8 stream.parallel().forEach循环并且所有任务都是独立的,无状态的等等 - 除了提交到公共FJ池 - 然后在并行循环内嵌套并行循环执行得更差而不是在并行循环内嵌套顺序循环.更糟糕的是:如果同步包含内循环的操作,您将获得DEADLOCK.
演示性能问题
如果没有"同步",您仍然可以观察到性能问题.您可以在以下网址找到演示代码:http://svn.finmath.net/finmath%20experiments/trunk/src/net/finmath/experiments/concurrency/NestedParallelForEachTest.java (有关更详细的说明,请参阅JavaDoc).
我们的设置如下:我们有一个嵌套的stream.parallel().forEach().
现在:将24个外循环任务提交给具有并行性的池8我们期望24/8*11 =最多33秒(在8核或更好的机器上).
结果是:
问题:你能证实这种行为吗?这是人们对框架的期望吗?(我现在更加小心,声称这是一个错误,但我个人认为这是由于ForkJoinTask的实现中的一个错误.备注:我已将此发布到并发兴趣(请参阅http:// cs.oswego.edu/pipermail/concurrency-interest/2014-May/012652.html),但到目前为止我没有得到确认).
证明了僵局
以下代码将为DEADLOCK
// Outer loop
IntStream.range(0,numberOfTasksInOuterLoop).parallel().forEach(i -> {
doWork();
synchronized(this) {
// Inner loop
IntStream.range(0,numberOfTasksInInnerLoop).parallel().forEach(j -> {
doWork();
});
}
});
Run Code Online (Sandbox Code Playgroud)
其中numberOfTasksInOuterLoop = 24,numberOfTasksInInnerLoop = 240,outerLoopOverheadFactor = 10000和 …
至于我可以研究,UTC和祖鲁是一样的.但是,我在比较我在代码中从不同来源收到的两个ZonedDateTime时遇到了困难.以下代码说明了该问题:
@Test
public void equalsOnTimezone() throws Exception {
ZonedDateTime zdtUtc = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC"));
ZonedDateTime zdtZ = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z"));
assertEquals(zdtUtc, zdtZ); // will fail
}
Run Code Online (Sandbox Code Playgroud)
问题:
java.lang.AssertionError: expected:<2015-02-01T14:30Z[UTC]> but was:<2015-02-01T14:30Z>
Run Code Online (Sandbox Code Playgroud)
那么创建和比较基于UTC的值的正确方法是什么呢?
根据W3C 日期和时间格式:
时间以UTC(协调世界时)表示,带有特殊的UTC指示符("Z").
我想获取类的所有方法,包括public,protected,package和private方法,以及包括继承的方法.
记得:
Class.getDeclaredMethods()获取public,protected,package和private方法,但不包括继承的方法.Class.getMethods获取继承的方法,但只获取公共方法.在Java 8之前,我们可以做一些事情:
Collection<Method> found = new ArrayList<Method>();
while (clazz != null) {
for (Method m1 : clazz.getDeclaredMethods()) {
boolean overridden = false;
for (Method m2 : found) {
if (m2.getName().equals(m1.getName())
&& Arrays.deepEquals(m1.getParameterTypes(), m2
.getParameterTypes())) {
overridden = true;
break;
}
}
if (!overridden) found.add(m1);
}
clazz = clazz.getSuperclass();
}
return found;
Run Code Online (Sandbox Code Playgroud)
但是现在,如果类使用默认方法实现某些接口而不被具体超类覆盖,则这些方法将逃避上述检测.此外,现在有关于具有相同名称的默认方法的规则,并且还必须考虑这些规则.
问题:获取类的所有方法的当前推荐方法是什么:
"all"的最常见定义应该是可以在类的实例方法中直接访问的方法,而不使用super或类名:
如果我已经将日期的月,日和年作为整数,那么使用它们创建LocalDate对象的最佳方法是什么?我发现这篇文章字符串为LocalDate,但它以String日期的表示开头.
我安装了JDK8u40,但只找到了javafx-src.zip.
我在哪里可以找到JDK的源代码?src.zip?
以下是安装后的内容:
顺便说一句,我没有看到安装向导!这很奇怪.

今天我尝试了几个Java安装包.所有都是从Oracle官方网站下载的.
双方6u45并7u75在我的箱子装好.我可以看到安装向导.并src.zip安装.
但是8u25〜8u40都安静地安装了.并且没有安装src.zip文件,因为我没有机会在向导中选择它.
我不确定这是我的错,还是Oracle的某个人犯了错误.
正如@SubOptimal所评论的那样,该/s选项表示静默安装.我想知道是否有强制GUI安装向导打开的选项.
我在用 Windows 7 Enterprise x64 Build 7601 SP1
我遇到了一些代码,尽管有点阅读,但我仍然难以理解.调用一个方法,该方法接收两个args,其中一个是Runnable.而不是传入一个Runnable对象虽然有一个lambda.
例如:
public class LambdaTest {
private final Lock lock = new ReentrantLock();
@Test
public void createRunnableFromLambda() {
Locker.runLocked(lock, () -> {
System.out.println("hello world");
});
}
public static class Locker {
public static void runLocked(Lock lock, Runnable block) {
lock.lock();
try {
block.run();
} finally {
lock.unlock();
}
}
}
}
所以我的问题是,你能解释一下如何从lambda创建Runnable,还请有人解释语法() - > {}.具体来说,()括号是什么意思?
谢谢.
请问,有人可以帮我弄清楚为什么下面的代码用jdk8u45及以上代码编译但是jdk8u25失败了吗?我查看了JDK发行说明,但没有找到任何与此问题相关的内容或者可能错过了它.
代码
public class Main {
static class Param {
final int id;
Param(int id) {
this.id = id;
}
}
static class Subtask {
final Param param;
Subtask(Param param) {
this.param = param;
}
}
public static void main(String[] args) {
List<? extends Param> params = IntStream.range(1, 100).mapToObj(Param::new).collect(Collectors.toList());
NavigableMap<String, Subtask> map = params.stream()
.collect(Collectors.toMap(p -> UUID.randomUUID().toString(), Subtask::new, (a, b) -> a, TreeMap::new));
}
}
Run Code Online (Sandbox Code Playgroud)
jdk8u25例外:
Error:(33, 17) java: no suitable method found for collect(java.util.stream.Collector<org.ka.Main.Param,capture#1 of ?,java.util.TreeMap<java.lang.String,org.ka.Main.Subtask>>)
method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super …Run Code Online (Sandbox Code Playgroud) 我有一个java.time.Instant创建数据字段的实体:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Item {
private String id;
private String url;
private Instant createdDate;
}
Run Code Online (Sandbox Code Playgroud)
我com.fasterxml.jackson.databind.ObjectMapper用来将项目保存为Elasticsearch作为JSON:
bulkRequestBody.append(objectMapper.writeValueAsString(item));
Run Code Online (Sandbox Code Playgroud)
ObjectMapper 将此字段序列化为对象:
"createdDate": {
"epochSecond": 1502643595,
"nano": 466000000
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试注释,@JsonFormat(shape = JsonFormat.Shape.STRING)但它对我不起作用.
我的问题是如何将此字段序列化为2010-05-30 22:15:52字符串?
java8使用Homebrew进行安装似乎不再起作用。运行后:
brew install caskroom/cask/java8
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error: Cask 'java8' is unavailable: '/usr/local/Homebrew/Library/Taps/caskroom/homebrew-cask/Casks/java8.rb' does not exist.
Run Code Online (Sandbox Code Playgroud)
简单地做:
brew cask install java8
Run Code Online (Sandbox Code Playgroud)
错误出在:
Error: Cask 'java8' is unavailable: No Cask with this name exists.
Run Code Online (Sandbox Code Playgroud)
这似乎是最新的发展,因为我记得几个月前以这种方式安装它。有关如何java8在当今的MacOS 上正确安装的任何建议?
似乎IntStream.iterate只是的轻量级订购版本IntStream.generate。是真的吗 如果没有,核心区别是什么?
java ×10
java-8 ×10
java-stream ×2
concurrency ×1
date ×1
datetime ×1
homebrew ×1
inheritance ×1
jackson ×1
java-time ×1
javac ×1
lambda ×1
macos ×1
objectmapper ×1
openjdk ×1
reflection ×1
timezone ×1