Tôi đọc về việc triển khai khung công tác Fork/Join đã được giới thiệu trong Java 7 và tôi chỉ muốn kiểm tra xem tôi có hiểu cách hoạt động của phép thuật không.java Fork/Tham gia làm rõ về cách sử dụng ngăn xếp
Như tôi đã hiểu, khi có một nhánh ren, nó tạo ra các phần phụ trong hàng đợi của nó (mà chủ đề khác có thể hoặc không thể đánh cắp). Khi thread cố gắng "join", nó thực sự kiểm tra hàng đợi của nó cho các nhiệm vụ hiện có và sau đó đệ quy thực hiện chúng, có nghĩa là đối với bất kỳ hoạt động 'join' nào - 2 khung sẽ được thêm vào ngăn xếp chuỗi cuộc gọi (một cho phép nối và một) cho lời gọi nhiệm vụ mới được thực hiện).
Như tôi biết rằng JVM không hỗ trợ tối ưu hóa cuộc gọi đuôi (có thể phục vụ trong trường hợp này để loại bỏ khung ngăn xếp phương thức kết nối) Tôi tin rằng trong khi thực hiện thao tác phức tạp với nhiều nhánh và tham gia một chuỗi có thể ném an StackOverflowError
.
Tôi có đúng hay họ đã tìm thấy một số cách hay để ngăn chặn nó?
EDIT
Dưới đây là một kịch bản để giúp làm rõ câu hỏi: Say (vì đơn giản) mà chúng ta chỉ có một thread trong hồ bơi forkjoin. Tại một thời điểm nào đó - các nhánh ren và sau đó các cuộc gọi tham gia. Trong khi trong phương thức join, thread phát hiện ra rằng nó có thể thực hiện nhiệm vụ được chia đôi (như nó được tìm thấy trong hàng đợi của nó) để nó gọi nhiệm vụ tiếp theo. Nhiệm vụ này lần lượt dĩa và sau đó gọi tham gia - vì vậy trong khi thực hiện các phương pháp tham gia các chủ đề sẽ tìm thấy nhiệm vụ chia rẽ trong hàng đợi của nó (như trước) và gọi nó. trong giai đoạn đó ngăn xếp cuộc gọi sẽ chứa ít nhất các khung cho hai phép nối và hai tác vụ.
vì bạn có thể thấy khung nối ghép nối được chuyển thành đệ quy đơn giản. Bởi vì java không hỗ trợ tối ưu hóa cuộc gọi đuôi - mọi đệ quy trong java có thể gây ra StackOverflowError
nếu nó đủ sâu.
Câu hỏi của tôi là - người thực hiện khung ngã ba/tham gia có tìm thấy một số cách hay để ngăn chặn tình huống này không.
@assylias - chắc chắn nếu bạn có thể rảnh rỗi :) – bennyl