"Xin chào, Amigo! Chúng tôi có một chủ đề mới và rất khó. Tôi xin lỗi. Nó thường được coi là một trong những chủ đề phức tạp nhất không chỉ trong Java mà còn trong lập trình nói chung. Tôi đang nói về đa luồng . "

Hãy tưởng tượng một trò chơi máy tính điển hình, chẳng hạn như trò chơi đua tàu vũ trụ. Bạn đang bay qua không gian rộng lớn của vũ trụ, né tránh các thiên thạch và tàu tuần dương tuần tra. Hai chục người khác đang tham gia với bạn trong những cuộc đua bất hợp pháp này.

Giả sử bạn quyết định viết một trò chơi như vậy. Chương trình của bạn sẽ phải theo dõi các lệnh (nhập bàn phím), di chuyển tàu vũ trụ, tính toán quỹ đạo của chúng, xác định hậu quả của bất kỳ vụ va chạm nào và vẽ tất cả những điều này lên màn hình của người dùng. Đây là công việc rất phức tạp.

Hãy nhớ cách chúng ta giải quyết «vấn đề cực kỳ phức tạp» trong ví dụ về công ty vận chuyển đang phát triển?

Chúng tôi chia nó thành các bộ phận độc lập và quy định rõ ràng (tiêu chuẩn hóa) cách chúng có thể tương tác với nhau.

"Nhưng chúng ta sẽ làm gì khi các bộ phận độc lập phải thực hiện một số công việc song song với các bộ phận khác?! Câu trả lời cho câu hỏi này là các luồng ."

Hãy thử tưởng tượng một chương trình giống như một rô-bốt nhỏ chạy xung quanh mã và thực thi các lệnh . Đầu tiên, nó thực thi một lệnh trên một dòng, sau đó chuyển sang dòng tiếp theo, v.v.

"Tôi có thể nhìn thấy nó trong tâm trí của tôi. Miếng bánh!"

"Rất tốt. Và bây giờ hãy tưởng tượng rằng bạn có một số rô-bốt này. Trong khi một rô-bốt đang xử lý đầu vào của người dùng, rô-bốt thứ hai đang cập nhật các đối tượng dựa trên đầu vào đó. Rô-bốt thứ ba thực thi mã để hiển thị các đối tượng này trên màn hình. Vài lần trong một giây, lần thứ tư kiểm tra xem có tàu nào va chạm hay không và nếu có thì tính toán kết quả va chạm."

Do đó, chúng ta không chỉ có thể chia chương trình thành các phần/đối tượng độc lập mà còn có thể làm cho các phần này có thể thực hiện công việc của chúng một cách độc lập với nhau. Càng ít tương tác giữa các phần riêng lẻ, chương trình càng ít phức tạp.

Hãy tưởng tượng rằng bạn có thể thay thế trình quản lý bằng một tập lệnh gửi thư . Và các bộ phận khác của công ty thậm chí không thể biết được đã có sự thay đổi. Loại điều này đã xảy ra sớm nhất là vào thế kỷ 26 với kết quả tuyệt vời. Hầu hết các nhà quản lý, và thậm chí cả những giám đốc điều hành hàng đầu, có thể được thay thế thành công bằng một kịch bản có độ phức tạp trung bình. Chỉ sau khi « hiệp hội sinh vật phù du văn phòng » can thiệp, việc sa thải hàng loạt các nhà quản lý mới chấm dứt. Nhưng tôi lạc đề.

"Thật thú vị!"

"Không chỉ có thể có một số " rô-bốt nhỏ " này thực thi mã, chúng còn có thể giao tiếp với nhau và sinh ra rô-bốt mới."

"Sinh ra người máy mới?"

"Vâng, để thực hiện các nhiệm vụ mới. Đôi khi, sẽ thuận lợi hơn nếu tạo một rô-bốt khác (một luồng khác) để thực hiện một số hành động cùng lúc với luồng (rô-bốt) hiện tại."

" Điều này nghe có vẻ là một điều tốt, nhưng tôi không thể nghĩ ra mình sẽ sử dụng nó ở đâu. "

Và tại sao chúng ta gọi chúng là « chủ đề »?

"Hãy tưởng tượng rằng mỗi rô-bốt có một màu khác nhau và đánh dấu các lệnh bằng màu của nó khi thực hiện chúng. Đường đi của rô-bốt nhỏ giống như đường kẻ do bút chì để lại. Đường đi này chạy dọc phía sau rô-bốt, giống như một sợi chỉ phía sau một cây kim."

Mỗi «người máy nhỏ» có một nhiệm vụ mà nó được tạo ra để thực hiện. Bạn có thể coi một luồng là tập hợp các lệnh được thực hiện trong khi thực hiện tác vụ này.

Giả sử bạn đang bay trên một con tàu vũ trụ để vận chuyển hàng hóa. Sau đó «giao hàng» là nhiệm vụ của bạn và bạn đang thực hiện nó. Và đường bay của bạn là chủ đề của bạn. Chúng ta có thể nói rằng mỗi nhiệm vụ mới, mỗi nhiệm vụ chưa được hoàn thành đều có luồng riêng của nó (một con đường vẫn cần phải đi qua).

"Nói cách khác, có một nhiệm vụ và một" rô-bốt nhỏ "thực hiện nó. Và một sợi dây chỉ là đường đi của rô-bốt khi nó hoàn thành nhiệm vụ của mình?"

"Chính xác."

Đó là cách mọi thứ hoạt động sâu bên trong. Vì máy tính chỉ có một bộ xử lý nên nó chỉ có thể thực hiện một lệnh tại một thời điểm. Vì vậy, đây là những gì xảy ra: bộ xử lý liên tục chuyển đổi giữa các luồng. Nó chuyển sang một luồng mới, thực hiện một vài lệnh, sau đó chuyển sang luồng tiếp theo, thực hiện một vài lệnh, v.v. Nhưng vì việc chuyển đổi giữa các luồng xảy ra hàng trăm lần mỗi giây, nên đối với chúng tôi, có vẻ như tất cả các luồng đang chạy đồng thời.

Đa luồng - 1