Khái niệm về Thread

Threading

1. Đa luồng (Multithreading) trong java

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ó chi 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.

2. Vòng đời của thread trong java

Java biểu diễn một luồng bằng một đối tượng mà ở đây gọi là thread. Bản thân mỗi thread mô tả một tác vụ cụ thể. Và nếu được gọi phương thức start(), đối tượng thread sẽ thực thi tác vụ đã được mô tả.

Một thead có thể nằm trong một trong năm trạng thái, tạo thành vòng đời của một thread. Vòng đời của thread được kiểm soát bởi JVM. Mặc dù vậy tài liệu từ Sun chỉ mô tả 4 trạng thái trong vòng đời của thread đó là new, runnable, non-runnable và terminated. Không có trạng thái Run. 

Các trạng thái của thread java như sau: 

  1. new
  2. runnable (ready to run)
  3. running
  4. sleeping
  5. waiting
  6. blocked
  7. dead

New: một thread ở trạng tái new nếu bạn tạo ra một đối tượng thread nhưng chưa gọi phương thức start()

Ready: sau khi thread được tạo, nó sẽ ở trạng thái sẵn sàng (ready) chờ phương thức start() được gọi

Running: Thread ở trạng thái chạy tức đang làm việc

Sleeping: Phương thức sleep() sẽ đưa thread vào trạng thái sleeping  dừng lại tạm thời. Sau thời gian sleeping thread lại tiếp tục hoạt động.

Waiting: Khi method wait() hoạt động, thread sẽ rơi vào trạng thái waiting  đợi. Methoad này được sử dụng khi hai hoặc nhiều thread cùng đồng thời hoạt động

Blocked: Thread sẽ rơi vào trạng thái blocked  bị chặn khi thread đó đang đợi một sự kiện nào đó của nó như là sự kiện Input/Output

Dead: Thread rơi vào trạng thái dead  ngừng hoạt động sau khi thực hiện xong phương thức run() hoặc gọi phương thức stop()

3. Tạo thread trong java

Làm thế nào để tạo thread trong java 

Có hai cách để tạo ra một thread: 

  1. Kế thừa từ lớp Thread
  2. Thực thi interface Runnable

3.1 Lớp Thread 

Lớp Thread cung cấp các constructor và phương thức để tạo và thực hiện các hoạt động trên một thread. Lớp Thread extends từ lớp Object và implements Runnable interface. 

Các constructor thường được sử dụng của lớp Thread 

  1. Thread()
  2. Thread(String name)
  3. Thread(Runnable r)
  4. Thread(Runnable r,String name)

Các phương thức thường được sử dụng của lớp Thread 

Phương thứcMô tả
public void run()Được sử dụng để thực hiện hành động cho một thread
public void start()Bắt đầu thực hiện thread. JVM gọi phương thức run() trên thread
public void sleep(long miliseconds)Làm cho thread hiện tại tạm ngừng thực thi cho số mili giây quy định
public void join()Đợi cho một thread chết
public void join(long miliseconds)Đợi cho một thread chết với các mili giây quy định
public int getPriority()Trả về mức độ ưu tiên của thread
public int setPriority(int priority)Thay đổi mức độ ưu tiên của thread
public String getName()Trả về tên của thread
public void setName(String name)Thay đổi tên của thread
public Thread currentThread()Trả về tham chiếu của thread đang được thi hành
public int getId()Trả về id của thread
public Thread.State getState()Trả về trạng thái của thread
public boolean isAlive()Kiểm tra nếu thread còn sống
public void yield()Làm cho các đối tượng thread đang thực thi để tạm thời tạm dừng và cho phép các thread khác để thực thi

3.2 Runnable interface 

interface Runnable nên được cài đặt bởi bất kỳ lớp nào mà thể hiển của lớp đó dự định sẽ được thực thi bởi thread. Interface Runnable chỉ có một phương thức run(). 

public void run():  Được sử dụng để thực hiện hành động cho một thread.

3.3 Start một thread 

Phương thức start() của lớp Thread được sử dụng để bắt đầu một thread mới được tạo. Nó thực hiện các nhiệm vụ sau: 

  • Start một new thread(với new callstack).
  • Thread chuyển từ trạng thái New sang trạng thái Runnable.

Khi thread được một cơ hội để thực thi, phương thức run() của nó sẽ chạy


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

Your email address will not be published. Required fields are marked *