Đa luồng khác nhau như thế nào trong Ứng dụng Web dựa trên Java và Ứng dụng Java độc lập


13

Tôi còn khá mới với Java và trải nghiệm của tôi chỉ giới hạn ở các Ứng dụng dựa trên web chạy trên Web Container (trong trường hợp của tôi là Jboss).

Tôi có đúng không khi nói rằng đối với các Ứng dụng Web, bộ chứa web sẽ xử lý đa luồng? Nếu vậy, tôi có thể giới thiệu các bước mới trong ứng dụng Web Dựa không? Có bất kỳ lợi thế nào khi làm như vậy và trong kịch bản nào người ta sẽ cần phải làm điều đó?


Cho đến EE6 Bạn sẽ không sử dụng Chủ đề; EE7 giới thiệu Concurrency Utilities.
Phục hồi Monica - M. Schröder

Câu trả lời:


20

Tôi có đúng không khi nói rằng đối với các Ứng dụng Web, bộ chứa web sẽ xử lý đa luồng?

Hầu hết các máy chủ web (Java và mặt khác, bao gồm JBoss) tuân theo mô hình "một luồng trên mỗi yêu cầu", tức là mỗi yêu cầu HTTP được xử lý hoàn toàn bởi chính xác một luồng. Chuỗi này thường sẽ dành phần lớn thời gian để chờ đợi những thứ như yêu cầu DB. Các thùng chứa web sẽ tạo chủ đề mới khi cần thiết.

Một số máy chủ (trong hệ sinh thái Java chủ yếu là Netty ) thực hiện xử lý yêu cầu không đồng bộ, với mô hình "một luồng thực hiện mọi thứ" hoặc một cái gì đó phức tạp hơn. Ý tưởng cơ bản là có nhiều luồng chờ sẽ lãng phí tài nguyên, do đó làm việc không đồng bộ có thể hiệu quả hơn.

Nếu vậy, tôi có thể giới thiệu các bước mới trong ứng dụng Web Dựa không?

Có thể, nhưng nên được thực hiện rất cẩn thận, vì các lỗi (như rò rỉ bộ nhớ hoặc thiếu đồng bộ hóa) có thể gây ra các lỗi rất khó tái tạo hoặc làm hỏng toàn bộ máy chủ.

Có bất kỳ lợi thế nào khi làm như vậy và trong kịch bản nào người ta sẽ cần phải làm điều đó?

Chà, lợi thế là bạn có thể làm những thứ song song. Sử dụng các luồng để cải thiện tốc độ tính toán thuần túy là điều bạn không nên làm trên máy chủ web, vì nó sẽ làm chậm việc xử lý các yêu cầu khác. Điều đó nên được thực hiện trên một máy chủ riêng biệt, có thể sử dụng một số loại hàng đợi công việc.

Một kịch bản hợp pháp cho đa luồng trong bối cảnh xử lý yêu cầu HTTP có thể là nếu bạn cần truy cập các tài nguyên mạng khác, ví dụ như gọi một số dịch vụ web khác nhau. Nếu bạn thực hiện trong một lần duy nhất, bạn phải đợi lần lượt từng cuộc gọi kết thúc. Nhưng nếu bạn sử dụng nhiều luồng, tổng thời gian chờ chỉ là độ trễ của cuộc gọi chậm nhất.


3
Có ý nghĩa. Giao diện ExecutorService có phải là cách tốt nhất để tạo chủ đề mới trong ứng dụng web không?
kapricanon

4
@kapricanon: có, trừ khi bạn có một số yêu cầu cụ thể mà nó không thể xử lý hoặc máy chủ web của bạn đã có một cái gì đó tương tự.
Michael Borgwardt

2

Trả lời câu hỏi của bạn:

Đa luồng khác nhau như thế nào trong Ứng dụng Web dựa trên Java và Ứng dụng Java độc lập

Nó không khác. Thông thường các ứng dụng web phần mềm được xây dựng dựa trên sẽ cung cấp một số luồng đa luồng bằng cách làm cho mỗi yêu cầu mới trở thành một luồng. Bởi bạn có thể sử dụng / tạo chủ đề giống như bất kỳ ứng dụng nào khác.

Thật vậy, đa luồng có thể giúp bạn tăng hiệu suất mạnh mẽ nếu bạn sử dụng đúng. Đối với các nhiệm vụ chuyên sâu I / O như truy cập mạng và truy cập ổ đĩa, hiệu suất tăng gần như luôn được đảm bảo. Đối với các tác vụ chuyên sâu tính toán, bạn nên tuân theo quy tắc một luồng trên mỗi lõi trong máy chủ. Ví dụ: nếu lõi của bạn có bộ xử lý i7, bạn nên bám vào 7 luồng để thực hiện các tác vụ tính toán.

Trả lời câu hỏi của bạn:

Có bất kỳ lợi thế nào khi làm như vậy và trong kịch bản nào người ta sẽ cần phải làm điều đó?

Michael Borgwart nói rằng bạn không nên làm điều này để cải thiện tốc độ tính toán. Tôi không đồng ý, như này bài viết cho thấy đa luồng có thể giúp cung cấp đáp ứng khi người dùng cần một công việc tính toán nặng thực hiện. Nói một cách dễ hiểu, người dùng sẽ không phải đợi lâu để hoàn thành các tác vụ nặng về tính toán với đa luồng.

Nếu bạn có ý định sử dụng nhiều chủ đề, tôi khuyên bạn nên sử dụng một nhóm chủ đề. Điều này sẽ làm giảm chi phí tạo chủ đề.


Làm thế nào để trả lời câu hỏi này?
gnat

1
Câu trả lời nên đứng trên giá trị riêng của họ. Nếu bạn muốn bình luận, bạn sẽ phải kiếm được 50 điểm danh tiếng trước tiên.
ChrisF

1

Vâng, đây là một câu hỏi hay và tôi nghĩ rằng hầu hết các nhà phát triển làm việc trong phát triển ứng dụng web không sử dụng đa luồng một cách rõ ràng. Lý do khá rõ ràng vì bạn đang sử dụng máy chủ ứng dụng để triển khai ứng dụng của mình, máy chủ ứng dụng quản lý nội bộ một nhóm luồng cho các yêu cầu đến.

Vậy thì tại sao lại sử dụng đa luồng một cách rõ ràng? Điều gì cần một nhà phát triển ứng dụng web phơi bày bản thân với đa luồng?

Khi bạn làm việc trên một ứng dụng quy mô lớn, nơi bạn phải cung cấp nhiều yêu cầu đồng thời, rất khó để phục vụ mọi loại yêu cầu một cách đồng bộ vì loại yêu cầu cụ thể có thể đã xử lý rất nhiều có thể làm giảm hiệu suất ứng dụng của bạn.

Hãy lấy một ví dụ trong đó một ứng dụng web sau khi phục vụ loại yêu cầu cụ thể phải thông báo cho người dùng thông qua email và SMS. Làm nó đồng bộ với chuỗi yêu cầu có thể làm giảm hiệu suất của ứng dụng web của bạn. Vì vậy, đây là vai trò của mutlithreading. Trong những trường hợp như vậy, nên phát triển một ứng dụng đa luồng độc lập qua mạng chỉ chịu trách nhiệm gửi email và SMS.


Tại sao câu trả lời này bị bỏ qua?
Anurag Sharma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.