繁体   English   中英

Java Parallel Streams关闭线程

[英]Java Parallel Streams close thread

我编写了一个使用Java流的方法,它简单地遍历对象列表并返回true / false,满足某些条件

Java方法:

 boolean method(SampleObj sampleObj) {

   List testList = invokeSomeMethod();
   int result = testList
            .parallelStream()
            .filter(listObj -> (listObj.getAttr() = 1))
            .count(listObj -> listObj.isAttr4());

   return (result > 10);

 }

我也写了一个模拟测试用例。 当我执行测试用例时,测试成功,但是我得到项目自定义错误,指出所有创建的线程都没有关闭。

我甚至尝试使用带有try-with-resources的流,而noo没有帮助。

模拟测试:

@Test
public void testSomeMethod() {
    SampleObj sampleObj1 = new SampleObj(10, 20, 30, true);
    SampleObj sampleObj2 = new SampleObj(10, 20, 30, true);
    SampleObj sampleObj3 = new SampleObj(10, 20, 30, false);
    SampleObj sampleObjTest = new SampleObj(10, 20, 30, true);

    List<SampleObj> testList = new ArrayList<SampleObj>();
    testList.add(sampleObj1);
    testList.add(sampleObj2);
    testList.add(sampleObj3);

    when(mockedAttribute.invokeSomeMethod()).thenReturn(nodeList);

    ClassToBeTested classTest = createGenericMockRules();
    Assert.assertTrue(classTest.method(sampleObjTest));
}

PS我已调试确认调用invokeSomeMethod()时,返回我的模拟testList。

据我所知,Java流在内部关闭它创建的线程。 我是否错误地实施了这个?

Java流不会创建线程,因此不会处置线程。 他们在内部使用线程池; 它是未指定的,但众所周知它是Fork / Join框架公共池

使用线程池的整个目的是允许池管理线程,而不是为每个作业创建和处置线程。 创建和销毁线程与成本相关联,当多个作业随后入队时应该避免这种成本。 特别是如果没有现有的线程来获取它,线程的创建时间会增加作业的执行时间。 换句话说,线程比作业更长寿,这是正常的。 他们正在等待可能到来的新工作。

ForkJoinPool类文档说明:

静态commonPool()可用,适用于大多数应用程序。 公共池由未显式提交到指定池的任何ForkJoinTask使用。 使用公共池通常会减少资源使用(其线程在不使用期间缓慢回收,并在后续使用时恢复)。

除了“缓慢”之外,它没有指定线程在被回收之前必须处于空闲状态的时间,因此它甚至可能因实现而异。 对于当前的实现,甚至不可能在超时方面说出来,因为池将缩短线程数而不是在超时后终止所有空闲线程,因此剩余的线程将再次等待,并且增加超时,直到池再次缩小大小,直到没有剩余空闲线程。 换句话说,池所拥有的线程越多,所有线程空闲时,在回收最后一个线程之前所需的时间就越长。

您可以强制您的测试等待所有线程的结束

while(ForkJoinPool.commonPool().getPoolSize()>0)
    LockSupport.parkNanos(1000);

但是这会显着增加测试的执行时间,例如用八个核心/线程来讨论一分钟的大小。 更好的解决方案是重新考虑您的“项目自定义错误”检查,根本不应该考虑您的代码负责内部使用的池创建的线程。

否则,在使用时可能会出现类似的错误,例如异步I / O等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM