Java 并行流关闭线程

问题描述 投票:0回答:2

我已经使用 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));
}

附注我已经调试确认当调用 invokeSomeMethod() 时,返回了我的模拟 testList。

据我所知,Java 流在内部关闭了它创建的线程。 我是否错误地执行了此操作?

java multithreading unit-testing java-stream
2个回答
8
投票

Java 流不会创建线程,因此不会释放线程。他们内部使用线程池;虽然未明确说明,但众所周知,它是 Fork/Join 框架的公共池

使用线程池的全部目的是让池管理线程,而不是为每个作业创建和处置线程。创建和销毁线程与成本相关,当多个作业随后排队时应避免这种情况。特别是,如果没有现有线程来接收线程,则线程的创建时间会增加作业的执行时间。换句话说,线程的寿命比作业长是正常的,也是有意的。他们正在等待可能到来的新工作。

ForkJoinPool

类文档指出:

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

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

您可以通过

强制测试等待所有线程结束
while(ForkJoinPool.commonPool().getPoolSize()>0)
    LockSupport.parkNanos(1000);

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

否则,您在使用时可能会遇到类似的错误,例如异步I/O等


0
投票

主线程是否等待parallelStream()完成执行?

  1. 如果我只是为每个人做
  2. 如果我正在收集清单 主线程在这些场景中将如何表现?
© www.soinside.com 2019 - 2024. All rights reserved.