在此代码示例中,ExecutorService使用了一个并允许超出范围.
public static void main(String[] args)
{
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(new Runnable()
{
public void run()
{
System.out.println("hello");
}
});
}
Run Code Online (Sandbox Code Playgroud)
一旦executorService超出范围,就应该收集并最终确定.ThreadPoolExecutor中的finalize()方法调用shutdown().
/**
* Invokes {@code shutdown} when this executor is no longer
* referenced and it has no threads.
*/
protected void finalize() {
shutdown();
}
Run Code Online (Sandbox Code Playgroud)
调用shutdown()后,池线程应终止,并允许JVM退出.但是,执行程序服务永远不会被收集,因此JVM保持活动状态.甚至对System.gc()的调用似乎也不起作用.为什么即使在main()终止后,executorService也没有被收集?
注意:我知道我应该自己调用shutdown(),而且我总是在测试之外做.我很好奇为什么最终确定不作为备份在这里工作.
给定一组可能重复的对象,我想最终得到每个对象的出现次数.我通过初始化一个空来做Map
,然后迭代Collection
并将对象映射到它的计数(每次地图已经包含对象时递增计数).
public Map<Object, Integer> countOccurrences(Collection<Object> list){
Map<Object, Integer> occurrenceMap = new HashMap<Object, Integer>();
for(Object obj: list){
Integer numOccurrence = occurrenceMap.get(obj);
if(numOccurrence == null){
//first count
occurrenceMap.put(obj, 1);
} else{
occurrenceMap.put(obj, numOccurrence++);
}
}
return occurrenceMap;
}
Run Code Online (Sandbox Code Playgroud)
对于计算出现次数的简单逻辑,这看起来过于冗长.有更优雅/更短的方式吗?我对一个完全不同的算法或java语言特定功能开放,允许更短的代码.
当Java编译器将一个原语自动装箱到包装器类时,它会在幕后生成什么代码?我想它叫:
是否有一个静态分析工具可以一致地强制使用@Override注释,可以在IDE之外运行?CheckStyle有一个MissingOverride检查,但它只适用于使用@inheritDoc Javadoc标记的方法.我正在寻找一种可以在持续集成机器上的新构建配置中运行的工具.
有没有理由为什么Scala中没有隐式的列表排序?
val lists = List(List(2, 3, 1), List(2, 1, 3))
lists.sorted
error: could not find implicit value for parameter ord: Ordering[List[Int]]
Run Code Online (Sandbox Code Playgroud)
编辑
是的,我的问题是为什么没有内置订购已隐含在范围内.对我来说,似乎显而易见的是,第二个列表应该"小于"第一个列表,因为0处的项目相等而第二个列表的较低项目为1.我想知道是否可能是因为没有好的答案列表有两种不同的尺寸.
我对按顺序关闭调度的线程的想法很满意ExectuorService
; 也就是说,调用shutdown
或shutdownNow
将导致池上创建的线程正常退出.如果他们回复interrupt
你,你可以确定最终会被调用等等,你会得到一个干净,可预测的退出(你可以清理任何资源等).
但是,如果您已将线程设置为守护程序(通过执行程序ThreadFactory
),如下所示.
ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setDaemon(true);
return thread;
}
});
Run Code Online (Sandbox Code Playgroud)
主线程终止后,VM将突然终止任何守护程序线程.在上面的示例中,调度然后突然终止的(守护进程)线程将绕过任何finally块,并且任何可中断的方法都不会抛出InterruptedException
.
所以,我倾向于认为,这标志着一个使用线程ThreadPoolExecutor
的池守护进程是不好的做法...我的问题是真的请他帮我练声曲为什么.
为什么在ExecutorService
线程池中使用守护程序线程是不好的做法(或者如果你不同意)?特别是我有兴趣通过正常关闭(具有中断策略并且运行良好的线程)与守护程序线程来描述VM关闭的生命周期.
扩展最后一点,finalize
on ThreadPoolExecutor
将调用shutdown
自身,但是当它使用守护程序线程时,如果finalize
VM调用它们,它们可能已经终止.那么线程池的行为是什么呢?如果底层线程突然终止,它是否可以被欺骗以保持活着(因此不会退出VM)?
我问的部分原因是因为我已经看到它曾经绕过了关闭实际的ExectorService的需要.您能想到绕过其关闭生命周期会产生不良影响的情况吗?到目前为止,我可以提出使用守护进程的唯一原因是采取捷径,我想欣赏它可能导致的任何意外的副作用.
我为项目运行了mvn依赖:tree,我看到如下输出:
[INFO] my:project:jar:1.0.0-SNAPSHOT
[INFO] +- some.other:library:jar:2.0.0:compile
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.0:compile
[INFO] | \- (org.slf4j:slf4j-api:jar:1.6.0:compile - omitted for conflict with 1.6.1)
Run Code Online (Sandbox Code Playgroud)
这是一个糟糕的状态,因为我的项目直接依赖于slf4j 1.6.0,而我们依赖的某些库依赖于slf4j 1.6.1.这两个版本恰好是二进制兼容的,因此构建过程没有任何警告.有没有办法让Maven对其依赖项解析更加严格,以便我可以配置一个在这种情况下会失败的新构建?在这种情况下,解决方案是将我们的依赖关系更新为更新版本的slf4j.
我有几个实现一些接口的类.接口有一个契约,有些方法应该同步,有些不应该,我想通过单元测试来验证所有实现的合同.这些方法应使用synchronized关键字或锁定this
- 非常类似于synchronizedCollection()包装器.这意味着我应该能够在外部观察它.
要继续的例子Collections.synchronizedCollection() ,如果我有一个线程调用迭代器(),我应该仍然能够进入象add()与另一个线程方法,因为迭代器()不应该做任何锁定.另一方面,我应该能够在外部同步集合,并在add()上看到另一个线程阻塞.
有没有一种方法可以测试方法是否在JUnit测试中同步?我想避免长时间的睡眠陈述.
java multithreading synchronization unit-testing thread-safety
IntelliJ IDEA的同事(从事另一个项目)向我展示了惊人的@NotNull注释.我在这里阅读了关于如何开始添加@NotNull的消息,节省了大量时间和头痛(当IntelliL 10检测到null会造成严重破坏时,它甚至可以自动将@NotNull自动添加到旧代码中).
因为我读了我的第一个"可能的@NotNull违规"消息(实时,在IDE中,甚至在一个尚未编译的部分.java文件上),我的下巴掉了下来,我迷上了.
所以我想知道:如果我们想在开发人员同时使用Eclipse和IntelliJ的项目中开始使用@NotNull,还有什么需要知道的吗?
我知道IntelliJ附带了annotations.jar.这与Eclipse兼容吗?
java ×7
concurrency ×2
scala ×2
annotations ×1
autoboxing ×1
collections ×1
daemon ×1
eclipse ×1
maven ×1
maven-2 ×1
maven-3 ×1
scala-2.8 ×1
unit-testing ×1