2013-08-14 49 views
5

Tôi không biết khi nào tôi nên sử dụng Multithread trong phát triển Java và logic/lý do sử dụng nó. Làm thế nào nó giúp đỡ trong các tình huống khác nhau?Khi nào/Tại sao tôi nên sử dụng Multithread trong Java?

Kịch bản 1

Tôi đang thực hiện một di chuyển trò chơi 2D với kẻ thù và tất cả những gì, suy nghĩ của sên kim loại

Kịch bản 2

Tôi đang thực hiện một daemon cơ sở dữ liệu để kiểm tra nhiều cơ sở dữ liệu Nội dung.

Kịch bản 3

Tôi đang tạo một servlet cho JSP, với một số thông tin được tìm nạp từ cơ sở dữ liệu.

Hãy chỉnh sửa các kịch bản để cải thiện tình huống.

Ngoài ra: Tôi có nên sử dụng đa luồng cho máy chủ trò chơi không? Hay tôi nên không?

+7

cách câu hỏi quá chung chung ... – Sebastian

+0

@Sebastian Well .... Tôi đã tìm kiếm một chút và tôi thấy điều này, nhưng tôi không hài lòng với câu trả lời. Vì vậy, tôi hỏi lại theo cách mà tôi muốn. Nếu điều này quá rộng thì đó là câu hỏi này: http://stackoverflow.com/questions/7419619/ –

+1

Tôi tin rằng câu hỏi là đủ cụ thể để được tạm ngừng. – supersam654

Trả lời

5

Tôi không biết khi nào tôi nên sử dụng Multithread trong phát triển Java và logic/lý do sử dụng nó. Làm thế nào nó giúp đỡ trong các tình huống khác nhau?

Bạn nên thay đổi chương trình của mình để sử dụng chuỗi vì một vài lý do khác nhau.

  • Khi chương trình chạy nhanh hơn và sử dụng tốt hơn kiến ​​trúc nhiều CPU/lõi mà bạn đang chạy. Tôi sử dụng từ "đáng kể" bởi vì thường thêm chủ đề thêm rất nhiều phức tạp để cải thiện tốc độ 20% có thể không đáng giá. Tuy nhiên, có thể khó khăn để xác định xem chương trình của bạn có sử dụng nhiều bộ vi xử lý đúng cách để việc làm lại chương trình là một sự đầu tư tốt hay không. Tuy nhiên, điều này có thể khó khăn. Chỉ khi có rất nhiều xử lý/tính toán liên quan bạn sẽ nhận được một sự gia tăng tốc độ. Ví dụ, nếu chương trình của bạn đang chờ IO (đĩa hoặc đọc mạng hoặc viết) thì bạn có thể dành nhiều công việc tách một chương trình thành nhiều luồng chỉ để không thấy cải thiện tốc độ.

  • Khi có nhiều phần của chương trình sẽ chạy đồng thời. Nó không phải là nó không thể chạy trong một sợi nhưng để làm như vậy sẽ phức tạp hơn. Ví dụ, một máy chủ web có nhiều yêu cầu xử lý chủ đề vì nó dễ dàng hơn để có mỗi thread xử lý một yêu cầu duy nhất mặc dù bạn có thể không được đặt một tấn tải thông qua máy chủ để nhiều chủ đề làm cho nó thực hiện nhanh hơn.

Ngoài ra: Câu hỏi tương tự cho J2EE thứ, khi tôi nên sử dụng multithread trong servlets của tôi? Hay tôi nên không?

Tôi nghĩ rằng các câu trả lời tương tự ở trên sẽ áp dụng. Nói chung servlet là những nhiệm vụ rất nhỏ được thiết kế để quay trở lại nhanh chóng vì vậy nó là tương đối bất thường đối với họ để đề ngã ba. Tuy nhiên, nếu có một nhiệm vụ chạy dài mà một servlet cần khởi động nhưng bạn muốn nó trả về kiểu trả lời "Bắt đầu công việc" thì một chuỗi sẽ là cần thiết. Điều quan trọng cần lưu ý là vào thời điểm servlet của bạn được thực hiện, trình xử lý ngược dòng có thể đã sử dụng một nhóm luồng để bạn không phải làm gì cả.


Edit:

Kịch bản 1 - Tôi đang thực hiện một di chuyển trò chơi 2D với kẻ thù và tất cả những gì, suy nghĩ của sên kim loại

Tôi không có một tốt trả lời cho điều này. Phụ thuộc vào việc có rất nhiều kết xuất đang diễn ra và nó phụ thuộc vào những bộ công cụ bạn đang sử dụng.

Tình huống 2 - Tôi đang tạo một trình nền cơ sở dữ liệu để kiểm tra nhiều nội dung cơ sở dữ liệu.

Rất có thể bạn sẽ là cơ sở dữ liệu IO bị ràng buộc để nhiều chủ đề có thể không cung cấp cho bạn bất cứ điều gì. Sau đó, một lần nữa, nếu bạn có các truy vấn chạy dài, bạn có thể nhận được một số cải tiến nếu các truy vấn ngắn có thể được thực thi song song với các chủ đề khác. Điều này cũng phụ thuộc vào cách cơ sở dữ liệu của bạn xử lý nhiều kết nối.

Tình huống 3 - Tôi đang tạo một servlet cho JSP, với một số thông tin được tìm nạp từ cơ sở dữ liệu.

Nếu phản hồi phải chờ thông tin được tìm nạp thì không có lý do gì để thực hiện điều này trong chuỗi khác. Tuy nhiên, như tôi đã đề cập ở trên, nếu servlet đang cố gắng chia rẽ một số loại giao dịch cơ sở dữ liệu chạy trong nền thì bạn nên sử dụng một luồng.

Một lần nữa, hầu hết các thùng chứa servlet đã chạy bên trong một nhóm luồng.

+0

Vì vậy, các máy chủ như Tomcat sẽ tự động xử lý đa luồng phải không? –

+0

Phải @Louie. Khi servlet của bạn được gọi, đã có nhiều luồng được sử dụng. Bạn có thể thấy chúng với jconsole. – Gray

1

Sử dụng Multi-Threading khi bạn có thể nghĩ rằng một thứ gì đó có thể được song song hoặc có thể được thực hiện không đồng bộ.

song song Ví dụ: Trong khi xây dựng web crawler, bạn có thể có đề song song đó duyệt qua các trang khác nhau vv Điều này có thể cũng có nghĩa là tận dụng tốt hơn các nguồn tài nguyên (CPU, I/O vv)

Asynchronous theo nghĩa , trong trường hợp của người tiêu dùng sản xuất, nơi bạn có một khối mã sản xuất công cụ và phần còn lại tiêu thụ nó.

0

Tôi không biết khi nào tôi nên sử dụng Multithread trong việc phát triển Java

-Sau đó bạn không nên. Ngoài ra, nếu bạn có thể tránh nó, bằng mọi cách làm như vậy.

Khi: Ví dụ: Nếu bạn cần tìm giá trị thị phần của các cổ phiếu khác nhau từ nhiều trang web/tài nguyên cùng một lúc để cập nhật các hệ thống môi giới khác nhau, bạn có thể cần phải từ một trang web đầu tiên trước khi nó cố gắng nhận được từ trang web tiếp theo.

Dựa từ chỉnh sửa của bạn trong question- bạn

Secnario 1: Tôi đang làm cho một trò chơi di chuyển 2D với kẻ thù và tất cả rằng, suy nghĩ của sên kim loại

Có bạn có thể . Một ví dụ sẽ làm tải các nguồn tài nguyên trong một chủ đề trong khi hiển thị một "Đang tải ..."Hình ảnh động trên màn hình trong thread khác.

+0

Trong thời gian chiến tranh xử lý dựa trên lõi và không phải là hertz, tôi nghĩ rằng nếu bạn có thể tránh được nó, bạn có thể làm như vậy.' Đúng vậy, khi được sử dụng không phù hợp hoặc không chính xác, nó có thể gây ra vấn đề. không có nghĩa là nó nên tránh bằng mọi giá. Đa luồng nên được sử dụng một cách có trách nhiệm. – digitaljoel

+0

@digitaljoel Bạn hiểu sai. Câu trả lời của tôi áp dụng cho những người bắt đầu với "Tôi không biết khi nào tôi nên sử dụng Multithread trong phát triển Java" có nghĩa là họ vẫn còn mới, và khi họ có thể trả lời câu hỏi của họ, họ đã nghiên cứu/nghiên cứu đủ để biết những gì bạn nói. Nhưng tôi đã đưa ra các ví dụ vì OP muốn biết khi nào nên sử dụng. –

1

Nó không thực sự thích bạn một lần học đa luồng, sau đó bạn sử dụng nó mọi lúc ở khắp mọi nơi. Bạn sử dụng đa luồng khi bạn cần nó.

Ví dụ bạn có một nhiệm vụ lâu để làm, và bạn không muốn khóa giao diện người dùng, bạn có thể thực hiện tác vụ trên một chuỗi khác trong khi giao diện người dùng của bạn vẫn hoạt động tốt, đó có thể là một tình huống. trong nhiều bước độc lập, sau đó nó có thể được thực hiện song song bằng cách sử dụng đa luồng.

0

Giả sử bạn có n ứng dụng chịu trách nhiệm tải xuống tệp, nếu bạn không sử dụng nhiều luồng, tất cả các hướng dẫn khác sẽ đợi cho đến khi tệp hoàn tất tải xuống. Swing ví dụ sử dụng một chủ đề đặc biệt để hiển thị gui của mình, vì vậy bạn nên xem qua hướng dẫn this và đọc một chút concurrency

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