Nội dung chính
-
Đa luồng (multithreading) trong java
- Đa luồng (Multithreading) trong java
- Vòng đời của thread trong java
- Tạo thread trong java
- Thread scheduler trong java
- Phương thức sleep trong java
- Start một thread hai lần
- Gọi phương thức run()
- Phương thức join()
- Đặt tên cho Thread
- Mức ưu tiên của một Thread
- Luồng hiểm trong java
- Thread pool trong java
- Thread group trong java
- Shutdown Hook trong java
- Thực hiện nhiều task
- Garbage Collection trong java
- Lớp Runtime trong java
- Đồng bộ trong java (Java Synchronization)
Đa luồng (multithreading) trong java
Đa luồng (Multithreading) 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).
Vòng đời của thread trong java
Một thead có thể nằm trong một trong năm trạng thái. Theo Sun, chỉ có 4 trạng thái trong vòng đời của thread trong java đó là new, runnable, non-runnable và terminated. Không có trạng thái run.
Nhưng để hiểu rõ hơn các thread, chúng ta sẽ tìm hiểu thread ở trong 5 trạng thái.
Tạo thread trong java
Có hai cách để tạo ra một thread:
- Bởi extends lớp Thread
- Bởi implements Runnable interface.
Thread scheduler trong java
Thread scheduler trong java hay trình lên lịch của thread trong java là một phần của JVM có nhiệm vụ quyết định thread nào nên được chạy.
Không có sự đảm bảo rằng thread có trạng thái runnable nào sẽ được chọn để chạy bởi thread scheduler.
Phương thức sleep trong java
Phương thức sleep() của lớp Thread được sử dụng để tạm ngứng một thread cho một khoảng thời gian nhất định.
Lớp Thread cung cấp hai phương thức để tạm ngưng một thread:
- public static void sleep(long miliseconds)throws InterruptedException
- public static void sleep(long miliseconds, int nanos)throws InterruptedException
Start một thread hai lần
Có thể start một thread hai lần không?
Không. Sau khi start một thread, nó không bao giờ có thể được start lại. Nếu bạn làm như vậy, một ngoại lệ IllegalThreadStateException sẽ xảy ra.
Gọi phương thức run()
Chuyện gì xảy ra khi gọi trực tiếp phương thức run() thay vì phương thức start()
- Mỗi thread start trong một call stack riêng biệt.
- Việc gọi phương thức run() từ luồng chính, phương thức run() được xếp vào call stack chứ không phải khởi tạo một call stack mới.
Phương thức join()
Phương thức join() chờ một thread chết. Nói cách khác, nó làm cho các thread đang chạy ngừng hoạt động cho đến khi luồng mà nó tham gia hoàn thành nhiệm vụ của nó.
Đặt tên cho Thread
Lớp Thread cung cấp các phương thức để thay đổi và lấy ra tên cho một thread. Theo mặc định, mỗi thread có một tên, tức là thread-0, thread-1, v.v. Bởi chúng ta có thể thay đổi tên của thread bằng cách sử dụng phương thức setName(). Cú pháp của setName() và getName() như sau:
Mức ưu tiên của một Thread
Mỗi thread có một mức ưu tiên (priority). Ưu tiên được đại diện bởi một số từ 1 đến 10. Trong hầu hết các trường hợp, lịch trình của thread được sắp xếp theo thứ tự ưu tiên của chúng (được gọi là lập kế hoạch ưu tiên). Nhưng nó không được bảo đảm bởi vì nó phụ thuộc vào thông số kỹ thuật của JVM.
Luồng hiểm trong java
Luồng hiểm trong java (thread daemon) là một luồng cung cấp dịch vụ cho luồng người dùng. Thời gian sống của nó phụ thuộc vào các luồng người dùng. Tức là khi tất cả các luồng người dùng chết, JVM sẽ tự động chấm dứt luồng này.
Có nhiều luồng hiểm java chạy tự động, ví dụ: Gc, finalizer, v.v.
Thread pool trong java
Thread pool trong java đại diện cho một nhóm các luồng đang chờ đợi công việc và tái sử dụng nhiều lần.
Trong trường hợp thread pool, một nhóm các thread có kích thước cố định được tạo ra. Một thread từ thread pool được kéo ra và được service provider phân công một công việc. Sau khi hoàn thành công việc, thread đó được chứa trong thread pool một lần nữa.
Thread group trong java
Java cung cấp một cách thuận tiện để nhóm nhiều thread trong một đối tượng duy nhất. Bằng cách đó, chúng ta có thể suspend, resume hoặc interrupt một nhóm các thread bằng việc gọi một phương thức duy nhất.
Shutdown Hook trong java
Shutdown Hook có thể được sử dụng để thực hiện dọn sạch tài nguyên hoặc lưu trữ trạng thái khi JVM tắt bình thường hoặc đột ngột. Thực hiện dọn sạch tài nguyên có nghĩa là đóng file log, gửi một số cảnh báo hoặc cái gì đó khác. Vì vậy, nếu bạn muốn thực hiện một vài dòng code trước khi JVM tắt, sử dụng shutdown hook.
Thực hiện nhiều task
Làm thế nào để thực hiện task duy nhất bởi nhiều thread?
Nếu bạn phải thực hiện task duy nhất bởi nhiều thread, chỉ có một phương thức run(). Ví dụ:
Garbage Collection trong java
Trong java, rác (garbage) có nghĩa là các đối tượng không còn được tham chiếu nữa.
Bộ thu gom rác (Garbage Collection) trong java được sử dụng để thực hiện quá trình tự động khôi phục lại bộ nhớ không được sử dụng tại runtime một cách tự động. Nói cách khác, đó là một cách để phá hủy các đối tượng không sử dụng nữa.
Chi tiết...
Lớp Runtime trong java
Lớp Runtime trong java được sử dụng để tương tác với môi trường runtime. Lớp Java Runtime cung cấp các phương thức để thực hiện một tiến trình, gọi GC, lấy tổng số và bộ nhớ free. Chỉ có một thể hiện của lớp java.lang.Runtime có sẵn cho một ứng dụng java.
Đồng bộ trong java (Java Synchronization)
Phương thức đồng bộ trong java
Đồng bộ trong java (Synchronization in java) là khả năng kiểm soát truy cập của nhiều luồng đến bất kỳ nguồn tài nguyên chia sẻ (shared resource).
Khối đồng bộ trong java
Khối đồng bộ trong java (Synchronized block) có thể được sử dụng để thực hiện đồng bộ hóa trên bất kỳ tài nguyên cụ thể nào của phương thức.
Phương thức đồng bộ static
Nếu bạn tạo ra bất kỳ phương thức nào với từ khóa synchronized được gọi là phương thức đồng bộ static, khi đó khóa sẽ được sử dụng trên lớp không phải trên đối tượng.
Deadlock trong java
Deadlock trong java hay bế tắc trong java là một phần của đa luồng. Deadlock có thể xảy ra trong trường hợp một luồng đang đợi một khóa đối tượng (object lock), được sử dụng bởi một luồng khác và luồng thứ hai đang chờ đợi một khóa đối tượng (object lock) được sử dụng bởi luồng thứ nhất. Vì cả hai luồng đang chờ đợi nhau để giải phóng khóa, tình trạng này được gọi là bế tắc (deadlock).
Giao tiếp giữa các thread trong Java
Giao tiếp giữa các thread trong Java (Inter-thread communication) là một kỹ thuật cho phép các luồng đồng bộ để giao tiếp với nhau.
Interrupt một thread trong java
Interrupt một thread trong java hay làm gián đoạn một luồng trong java. Nếu thread nằm trong trạng thái sleep hoặc wait (nghĩa là sleep() hoặc wait() được gọi ra), việc gọi phương thức interrupt() trên thread đó sẽ phá vỡ trạng thái sleep hoặc wait và ném ra ngoại lệ InterruptedException...