da-luong-java

Lập trình đa luồng trong Java

Java là một ngôn ngữ chương trình đa luồng (multithreaded), nghĩa là chúng ta có thể phát triển chương trình đa luồng sử dụng Java. Một chương trình đa luồng chứa hai hoặc nhiều phần mà có thể chạy đồng thời và mỗi phần có thể xử lý tác vụ khác nhau tại cùng một thời điểm, để sử dụng tốt nhất các nguồn có sẵn, đặc biệt khi máy tính của bạn có nhiều CPU.

Theo định nghĩa, đa nhiệm (multitasking) là khi nhiều tiến trình chia sẻ nguồn xử lý chung ví dụ như một CPU. Thread kế thừa ý tưởng của đa nhiệm trong các ứng dụng để bạn có thể chia nhỏ các hoạt động riêng biệt bên trong một ứng dụng đơn thành các luồng (thread) riêng lẻ. Mỗi một thread có thể chạy song song. OS phân chia thời gian xử lý không chỉ trong các ứng dụng khác nhau, mà còn trong mỗi luồng bên trong một ứng dụng.

Thread cho bạn khả năng viết một chương trình mà có nhiều hoạt động có thể phát sinh đồng thời.

Process và Thread trong Java

Đầu tiên khi nói về lập trình đa luồng, chúng ta cần phân biệt được 2 khái niệm Process (tiến trình) và Thread (luồng) trong Java:

ProcessThread
Khái niệmMột chương trình đang chạy được gọi là một process.Một chương trình chạy có thể có nhiều thread, Cho phép chương trình đó chạy trên nhiều luồng một cách “đồng thời”.
Không gian địa chỉMỗi process có một không gian địa chỉ riêng biệt.Tất cả thread thuộc một process chia sẻ không gian địa chỉ với nhau, hợp chúng lại thành một tiến trình.
Đa nhiệmĐa nhiệm dựa trên process cho phép máy tính chạy 2 hoặc nhiều hơn 2 chương trình đồng thời.Đa nhiệm dựa trên thread cho phép một chương trình chạy trên 2 hoặc nhiều luồng đồng thời.
Giao tiếpGiao tiếp giữa 2 tiến trình là tốn kém và bị giới hạn.Giao tiếp giữa 2 thread ít tốn kém hơn so với tiến trình.
Thành phầnMột tiến trình có: không gian địa chỉ, biến global, xử lí tín hiệu, những tiến trình con, thông tin tính toán.Một thread có: thanh ghi, trạng thái, stack, bộ đếm chương trình.
Điều khiểnĐa nhiệm dựa trên process không thuộc quyền kiểm soát của Java.Đa nhiệm dựa trên thread phụ thuộc quyền kiểm soát của Java.
Ví dụKhi chạy một ứng dụng Java thì đó được gọi là một tiến trình.Một ứng dụng đếm từ trong 1000 file, có sử dụng 4 luồng để chạy đồng thời.

Thread là gì? Multi-thread là gì?

Thread (luồng) về cơ bản là một tiến trình con (sub-process). Một đơn vị xử lý nhỏ nhất của máy tính có thể thực hiện một công việc riêng biệt. Trong Java, các luồng được quản lý bởi máy ảo Java (JVM).

Multi-thread (đa luồng) là một tiến trình thực hiện nhiều luồng đồng thời. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời làm ứng dụng chạy nhanh và hiệu quả hơn.

VD: Trình duyệt web hay các chương trình chơi nhạc là 1 ví dụ điển hình về đa luồng.

+ Khi duyệt 1 trang web, có rất nhiều hình ảnh, CSS, javascript… được tải đồng thời bởi các luồng khác nhau.

+ Khi play nhạc, chúng ta vẫn có thể tương tác được với nút điều khiển như: Play, pause, next, back … vì luồng phát nhạc là luồng riêng biệt với luồng tiếp nhận tương tác của người dùng.

Khái niệm về đa luồng trong Java

Đa luồng (multithreading) trong java là một tiến trình thực hiện nhiều luồng đồng thời.

Luồng (thread) về cơ bản là một tiến trình con (sub-process). Nó là đơn vị nhỏ nhất của tiến trình. Đa tiến trình (multiprocessing) và đa luồng (multithreading) cả hai được sử dụng để tạo ra hệ thống đa nhiệm (multitasking).

Nhưng chúng ta sử dụng đa luồng nhiều hơn đa tiến trình bởi vì các luồng chia sẻ một vùng bộ nhớ chung. Chúng không phân bổ vùng bộ nhớ riêng biệt để tiết kiệm bộ nhớ, và chuyển đổi ngữ cảnh giữa các luồng mất ít thời gian hơn tiến trình.

Đa luồng trong java được sử dụng hầu hết trong các game, hoạt hình,…

Ưu điểm của đa luồng trong java

1) Nó không chặn người sử dụng vì các luồng là độc lập và bạn có thể thực hiện nhiều công việc cùng một lúc.

2) Bạn có thể thực hiện nhiều hoạt động với nhau để tiết kiệm thời gian.

3) Luồng là độc lập vì vậy nó không ảnh hưởng đến luồng khác nếu ngoại lệ xảy ra trong một luồng duy nhất.

Đa nhiệm (multitasking)

Đa nhiệm là một quá trình thực hiện nhiều nhiệm vụ cùng một lúc. Chúng ta sử dụng đa nhiệm để tận dụng tính năng của CPU. Đa nhiệm có thể đạt được bằng hai cách:

  • Đa nhiệm dựa trên tiến trình (Process) – Đa tiến trình (Multiprocessing)
  • Đa nhiệm dựa trên luồng (Thread) – Đa luồng (MultiThreading)

Đa nhiệm dựa trên tiến trình (Process) – Đa tiến trình (Multiprocessing)

  • Mỗi tiến trình có địa chỉ riêng trong bộ nhớ, tức là mỗi tiến trình phân bổ vùng nhớ riêng biệt.
  • Tiến trình là nặng.
  • Sự giao tiếp giữa các tiến trình có tri phí cao.
  • Chuyển đổi từ tiến trình này sang tiến trình khác đòi hỏi thời gian để đăng ký việc lưu và tải, các bản đồ bộ nhớ, các danh sách cập nhật, vv.

Đa nhiệm dựa trên luồng (Thread) – Đa luồng (MultiThreading)

  • Các luồng chia sẻ không gian địa chỉ ô nhớ giống nhau.
  • Luồng là nhẹ.
  • Sự giao tiếp giữa các luồng có chi phí thấp.

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai.

Tài liệu + Khóa học lập trình FREE
Tài liệu + Khóa học lập trình FREE

DMCA.com Protection Status