小编Cra*_*lin的帖子

为什么这个线程池没有收集垃圾?

在此代码示例中,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(),而且我总是在测试之外做.我很好奇为什么最终确定不作为备份在这里工作.

java concurrency garbage-collection

31
推荐指数
2
解决办法
1万
查看次数

计算java集合中出现次数的优雅方法

给定一组可能重复的对象,我想最终得到每个对象的出现次数.我通过初始化一个空来做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 collections

30
推荐指数
4
解决办法
3万
查看次数

编译器为自动装箱生成了什么代码?

当Java编译器将一个原语自动装箱到包装器类时,它会在幕后生成什么代码?我想它叫:

  • 包装器上的valueOf()方法
  • 包装器的构造函数
  • 其他一些魔术?

java autoboxing

29
推荐指数
2
解决办法
3646
查看次数

如何强制使用@Override注释?

是否有一个静态分析工具可以一致地强制使用@Override注释,可以在IDE之外运行?CheckStyle有一个MissingOverride检查,但它只适用于使用@inheritDoc Javadoc标记的方法.我正在寻找一种可以在持续集成机器上的新构建配置中运行的工具.

java continuous-integration static-analysis

24
推荐指数
1
解决办法
2195
查看次数

视图和流有什么区别?

在Scala 2.8集合框架中,view和之间有什么区别toStream

scala scala-2.8

22
推荐指数
2
解决办法
2254
查看次数

为什么Scala列表没有订购?

有没有理由为什么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.我想知道是否可能是因为没有好的答案列表有两种不同的尺寸.

scala scala-collections

21
推荐指数
2
解决办法
7423
查看次数

在ExecutorService上安排的守护程序线程; 解释为什么这是不好的形式

我对按顺序关闭调度的线程的想法很满意ExectuorService; 也就是说,调用shutdownshutdownNow将导致池上创建的线程正常退出.如果他们回复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关闭的生命周期.

扩展最后一点,finalizeon ThreadPoolExecutor将调用shutdown自身,但是当它使用守护程序线程时,如果finalizeVM调用它们,它们可能已经终止.那么线程池的行为是什么呢?如果底层线程突然终止,它是否可以被欺骗以保持活着(因此不会退出VM)?

我问的部分原因是因为我已经看到它曾经绕过了关闭实际的ExectorService的需要.您能想到绕过关闭生命周期会产生不良影响的情况吗?到目前为止,我可以提出使用守护进程的唯一原因是采取捷径,我想欣赏它可能导致的任何意外的副作用.

java concurrency multithreading daemon executorservice

20
推荐指数
3
解决办法
2万
查看次数

如果存在依赖冲突,如何打破maven构建?

我为项目运行了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.

maven-2 dependency-management maven-3 maven

18
推荐指数
2
解决办法
5752
查看次数

测试Java方法是否同步的好方法是什么?

我有几个实现一些接口的类.接口有一个契约,有些方法应该同步,有些不应该,我想通过单元测试来验证所有实现的合同.这些方法应使用synchronized关键字或锁定this- 非常类似于synchronizedCollection()包装器.这意味着我应该能够在外部观察它.

要继续的例子Collections.synchronizedCollection() ,如果我有一个线程调用迭代器(),我应该仍然能够进入象add()与另一个线程方法,因为迭代器()不应该做任何锁定.另一方面,我应该能够在外部同步集合,并在add()上看到另一个线程阻塞.

有没有一种方法可以测试方法是否在JUnit测试中同步?我想避免长时间的睡眠陈述.

java multithreading synchronization unit-testing thread-safety

16
推荐指数
2
解决办法
6345
查看次数

在IntelliJ和Eclipse开发人员都在工作的项目中使用@NotNull

IntelliJ IDEA的同事(从事另一个项目)向我展示了惊人的@NotNull注释.我在这里阅读了关于如何开始添加@NotNull的消息,节省了大量时间和头痛(当IntelliL 10检测到null会造成严重破坏时,它甚至可以自动将@NotNull自动添加到旧代码中).

因为我读了我的第一个"可能的@NotNull违规"消息(实时,在IDE中,甚至在一个尚未编译的部分.java文件上),我的下巴掉了下来,我迷上了.

所以我想知道:如果我们想在开发人员同时使用Eclipse和IntelliJ的项目中开始使用@NotNull,还有什么需要知道的吗?

我知道IntelliJ附带了annotations.jar.这与Eclipse兼容吗?

java eclipse annotations intellij-idea

16
推荐指数
1
解决办法
3644
查看次数