19

Tôi sẽ thông qua mô hình đồng thời khác nhau trong môi trường multi-threading (http://tutorials.jenkov.com/java-concurrency/concurrency-models.html)hỗ trợ Java cho ba mô hình đồng thời khác nhau

Bài báo nhấn mạnh về ba đồng thời mô hình.

  1. Workers Parallel

    Mô hình đồng thời đầu tiên là những gì tôi gọi là mô hình lao động song song. Các công việc đến được gán cho các công nhân khác nhau.

  2. Dây chuyền lắp ráp

    Các công nhân được sắp đặt như nhân tại một dây chuyền lắp ráp tại một nhà máy. Mỗi công nhân chỉ thực hiện một phần công việc đầy đủ. Khi phần đó kết thúc, nhân viên sẽ chuyển công việc cho người lao động tiếp theo.

    Mỗi công nhân đang chạy theo chủ đề riêng của mình và không chia sẻ trạng thái với các công nhân khác. Điều này đôi khi còn được gọi là mô hình đồng thời không có gì được chia sẻ.

  3. chức năng Parallelism

    Ý tưởng cơ bản của xử lý song song chức năng là bạn thực hiện chương trình của bạn sử dụng chức năng cuộc gọi. Các chức năng có thể được xem như là "đại lý" hoặc "diễn viên" gửi tin nhắn cho nhau, giống như trong mô hình đồng thời của dây chuyền lắp ráp (hệ thống phản kháng hoặc sự kiện AKA). Khi một hàm gọi một hàm khác, nó tương tự như việc gửi một thông báo.

Bây giờ tôi muốn để lập bản đồ hỗ trợ API java cho ba khái niệm

  1. Workers Parallel: Có ExecutorService, ThreadPoolExecutor, CountDownLatch API?

  2. Dây chuyền lắp ráp: Gửi một sự kiện để hệ thống gửi tin nhắn như JMS & sử dụng khái niệm nhắn tin của Queues & chủ đề.

  3. Parallelism chức năng: ForkJoinPool ở một mức độ nào đó & java 8 stream. ForkJoin pool là dễ hiểu so với suối.

Tôi có chính xác trong việc ánh xạ các mô hình tương tranh này không? Nếu không xin vui lòng sửa tôi.

Trả lời

12

Mỗi mô hình đều cho biết cách công việc được thực hiện/tách ra từ một quan điểm chung, nhưng khi nói đến việc triển khai, nó thực sự phụ thuộc vào vấn đề chính xác của bạn. Nói chung tôi thấy nó như thế này:

  1. Workers Parallel: một nhà sản xuất tạo việc làm mới ở đâu đó (ví dụ trong một BlockingQueue) và nhiều chủ đề (thông qua một ExecutorService) xử lý những công việc song song. Tất nhiên, bạn cũng có thể sử dụng CountDownLatch, nhưng điều đó có nghĩa là bạn muốn kích hoạt một hành động sau khi chính xác N các vấn đề con đã được xử lý (ví dụ: bạn biết vấn đề lớn của mình có thể bị chia nhỏ trong N vấn đề nhỏ hơn, kiểm tra the second example here).
  2. Dây chuyền lắp ráp: cho mỗi bước trung gian, bạn có BlockingQueue và một Thread hoặc ExecutorService. Trên mỗi bước, các công việc được lấy từ một BlickingQueue và đặt vào kế tiếp, để được xử lý thêm. Với ý tưởng của bạn với JMS: JMS có thể kết nối các thành phần phân tán và là một phần của Java EE và không được cho là được sử dụng trong một bối cảnh đồng thời cao (thông điệp được lưu trữ thường trên đĩa cứng trước khi được xử lý).
  3. Parallelism chức năng: ForkJoinPool là ví dụ tốt về cách bạn có thể triển khai điều này.
+0

Cảm ơn. Nó sẽ là tuyệt vời nếu bạn cung cấp một số thông tin về Parallelism chức năng. –

+0

Đối với tính song song chức năng, hãy kiểm tra http://akka.io, khung công tác dựa trên mô hình diễn viên tốt nhất được xây dựng cho jvm. –

+0

Vào cuối hướng dẫn của mình, tác giả nói "Java EE chỉ không có cạnh nữa, tôi cảm thấy". Nó thực sự là trường hợp?Các kỹ thuật này chưa được kết hợp trong Java EE chưa? hoặc Họ không có kế hoạch để thêm vào trong tương lai? – JavaHopper

5

Một câu hỏi tuyệt vời mà câu trả lời có thể không hoàn toàn thỏa mãn. Các mô hình đồng thời được liệt kê hiển thị một số cách bạn có thể muốn thực hiện một hệ thống đồng thời.API cung cấp các công cụ được sử dụng để triển khai bất kỳ mô hình nào trong số này.

Cho phép bắt đầu với ExecutorService. Nó cho phép bạn gửi các nhiệm vụ được thực thi theo cách không chặn. Việc thực hiện ThreadPoolExecutor sau đó giới hạn số lượng tối đa các chủ đề có sẵn. ExecutorService không yêu cầu nhiệm vụ thực hiện quy trình hoàn chỉnh như bạn có thể mong đợi của một nhân viên song song. Nhiệm vụ có thể được giới hạn trong phần cụ thể của quy trình và gửi một thông báo sau khi hoàn thành, bắt đầu bước tiếp theo trong một dây chuyền lắp ráp.

CountDownLatch và ExecutorService cung cấp phương tiện chặn cho đến khi tất cả công nhân đã hoàn tất có thể có ích nếu một quy trình nhất định đã được chia cho các tác vụ phụ đồng thời khác nhau.

Điểm của JMS là cung cấp phương tiện để nhắn tin giữa các thành phần. Nó không thực thi một mô hình cụ thể cho sự tương tranh. Hàng đợi và chủ đề biểu thị cách thư được gửi từ nhà xuất bản đến người đăng ký. Khi bạn sử dụng hàng đợi, tin nhắn được gửi đến đúng một thuê bao. Mặt khác, chủ đề phát thông điệp tới tất cả người đăng ký của chủ đề.

Hành vi tương tự có thể đạt được trong một thành phần đơn lẻ bằng cách sử dụng mẫu quan sát viên.

ForkJoinPool thực sự là một triển khai của ExecutorService (có thể làm nổi bật khó khăn của việc khớp mẫu và chi tiết triển khai). Nó chỉ xảy ra để được tối ưu hóa để làm việc với số lượng lớn các nhiệm vụ nhỏ.

Tóm tắt: Có nhiều cách để triển khai một mô hình đồng thời nhất định trong môi trường Java. Các giao diện, các lớp và khung công tác được sử dụng trong việc thực hiện một chương trình có thể thay đổi bất kể mô hình đồng thời được chọn.

+0

tuyệt vời! Chỉ cần lưu ý, mỗi mô hình trong số đó phù hợp với một số trường hợp sử dụng khác nhau có thể được thực hiện bằng cách sử dụng các lớp Java utilised được đánh dấu một cách thận trọng. – yadab

Các vấn đề liên quan