2017-02-28 19 views
6

Tôi đã viết một phương pháp sử dụng Java suối mà chỉ đơn giản lặp trên danh sách của các đối tượng và trả về đúng/sai là điều kiện nhất định được thỏa mãnJava Streams Parallel chủ đề gần

Java Phương pháp:

boolean method(SampleObj sampleObj) { 

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

    return (result > 10); 

} 

Tôi đã viết một trường hợp thử nghiệm Mock cho cùng một tốt. Khi tôi thực hiện các trường hợp thử nghiệm, thử nghiệm thành công, tuy nhiên tôi nhận được lỗi tùy chỉnh dự án nói rằng tất cả các chủ đề tạo ra đã không tắt máy.

Tôi thậm chí đã thử sử dụng luồng với các tài nguyên thử với tính năng đó không có tác dụng.

Mock Test:

@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)); 
} 

T.B. Tôi đã sửa lỗi để xác nhận rằng khi invokeSomeMethod() được gọi, testList giả lập của tôi được trả về.

Theo như tôi biết, luồng Java đóng nội bộ các chuỗi tạo ra. Tôi có triển khai không chính xác không?

+0

Bạn đang chế nhạo cái gì? Bạn có thể hiển thị trường hợp thử nghiệm của mình không? –

+0

Đã thêm đoạn mã – learningMyWayThru

+0

Như một lưu ý phụ, cụm từ '== true' luôn luôn thừa. – chrylis

Trả lời

5

Luồng Java không tạo chủ đề và do đó, không thải bỏ chủ đề. Họ sử dụng một hồ bơi thread bên trong; không xác định nhưng cũng biết rằng đó là common pool of the Fork/Join framework.

Toàn bộ ý định sử dụng nhóm luồng là cho phép nhóm quản lý chuỗi, thay vì tạo và xử lý chuỗi cho từng công việc. Tạo và hủy các luồng được liên kết với các chi phí, điều này nên tránh khi nhiều công việc sau đó được enqueued. Đặc biệt là thời gian tạo chuỗi cho biết thêm thời gian thực hiện công việc nếu không có chuỗi hiện tại nào để chọn. Nói cách khác, nó là bình thường và dự định rằng các chủ đề sống lâu hơn các công việc. Họ đang chờ đợi những công việc mới có thể đến.

Các class documentation of ForkJoinPool trạng thái:

Một tĩnh commonPool() có sẵn và thích hợp cho hầu hết các ứng dụng. Hồ bơi chung được sử dụng bởi bất kỳ ForkJoinTask nào không được gửi một cách rõ ràng đến một nhóm được chỉ định. Việc sử dụng nhóm chung thường làm giảm việc sử dụng tài nguyên (các chủ đề của nó được thu hồi chậm trong các khoảng thời gian không sử dụng và được phục hồi khi sử dụng sau này).

Nó không chỉ định thời gian một luồng không hoạt động trước khi được xác nhận lại, bên cạnh "chậm", vì vậy nó thậm chí có thể khác nhau từ triển khai đến triển khai. Đối với việc thực hiện hiện tại, thậm chí không thể nói về thời gian chờ vì hồ bơi sẽ thu nhỏ số lượng chủ đề thay vì chấm dứt tất cả các chủ đề nhàn rỗi sau khi hết thời gian chờ, vì vậy các chủ đề còn lại sẽ đợi lại, với tăng thời gian chờ, cho đến khi hồ bơi sẽ thu nhỏ kích thước một lần nữa, cho đến khi không có thread nhàn rỗi còn lại. Nói cách khác, các chủ đề càng có nhiều hồ bơi, thì sẽ mất nhiều thời gian hơn cho đến khi chuỗi cuối cùng được khai hoang, khi tất cả các luồng không hoạt động.

Bạn có thể buộc xét nghiệm của bạn phải chờ đến cuối của tất cả các chủ đề qua

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

nhưng điều này có thể làm tăng thời gian thực hiện các bài kiểm tra của bạn đáng kể, ví dụ nói về độ lớn của một phút với 8 lõi/luồng. Giải pháp tốt hơn là phải suy nghĩ lại về kiểm tra "lỗi tùy chỉnh dự án" của bạn mà chỉ đơn giản là không nên xem xét mã của bạn chịu trách nhiệm về các chủ đề được tạo bởi các hồ bơi được sử dụng trong nội bộ.

Nếu không, bạn có thể gặp phải các lỗi tương tự khi sử dụng, ví dụ: I/O không đồng bộ, v.v.

+0

câu trả lời hoàn toàn tuyệt vời! – Eugene