Đa luồng trong java (Phần 2)


Bài viết của mình được  theo góc nhìn hay cách hiểu của mình từ bài viết : sinhvienit.net/ đã có sự cho phép của tác giả , các bạn nên đọc bài viết này trước khi đọc bài của mình.
I.Nhắc lại vài kiến thức phần trước.
=> Luồng() là đơn vị nhỏ nhất của tiến trình dùng để thực hiện một công việc đơn nào đó.

=> Luồng được sử dụng bởi máy ảo java một ứng dụng java ngoài luồng chính còn có các luồng phụ được thực thi đồn thời (Nói là thực thi đồng thời nhưng không phải chỉ là độ trễ thực thi giữa các luồng rất ngắn tức là thực thi lần lượt )

=> Có 2 tạo ra luồng
  +  Tạo ra một lớp được kế thừa từ lớp Thread
  +  Tạo ra lớp mở rông (Implement) từ Interface Runnable.

====>  Chúng ta sử dụng cách thứ 2 khi muốn kế thừa nhiều hơn 1 lớp ngoài lớp thread.Trong các trường hợp còn lại chúng ta sử dụng cách 1.

=> Từ khóa setPiority() dùng làm thông số ưu tiên quyết định khi cấp phát CPU cho luồng.
Một số từ khóa cần chú ý là getId() lấy Id của luồng do máy ảo cấp phát hay setName() lấy tên luồng.

II.Các trạng thái của luồng.

Sơ đồ dưới đây mô tả các trạng thái mà luồng có thể đạt được nhấn mạnh là có thể nhé và quá trình chuyển tiếp giữa các trạng thái khác nhau.



=> new Thread() đây là từ khóa khai báo hay gọi là khởi tại luồng như kiểu bạn chỉ vào và nói cho chương trình rằng đây là một luồng , chưa được cấp phát CPU chưa được chạy .Nếu bạn dùng từ khóa stop() hay resume() thì rất có thể gây ra lỗi.
Thread test = new Thread();

=> Start() đây là lúc bạn cấp phát sức mạnh CPU cho luồng để chạy và chuyển đến trạng thái Runnable ở đây chúng ta dùng từ Runnable thay cho từ Running vì không phải tất cả các luồng cùng chạy mà thực sự thì chúng chạy luân phiên nhau nhưng thời gian chuyển đổi giữa các luồng rất ngắn cỡ vài nanos => nói là chạy song song hay cùng lúc thì là sai về mặt bản chất nhưng có thể tạm chấp nhận.

=> Not Runnable : có thể hiểu là trạng thái không chạy của luồng khác với Dead là chết luồng bị hủy một luồng bị rơi vào trạng thái  Not Runnable thường vì ba nguyên nhân.
+ Rơi và trạng thái sleep ngủ đông , phải đợi cho đến khi hết thời gian chỉ định Sleep thì luồng mới hoạt động
+  Bị ngừng cấp phát CPU do dùng từ khóa suspend() chúng ta dùng từ khóa resume() để cấp phát cho luồng chạy trở lại.
+ Bị ngừng với từ khóa wait() tức là chờ đợi một điều kiện nào đó
+ Luồng bị Block vì IO ví dụ như luồng phải chờ đến khi người dùng nhập thông tin luồng bị Block.


Nói bên trên có vẻ chưa rõ lắm mình sẽ nói rõ hơn và giản thích các từ khóa về các trường hợp bị Not Runnable.
=> Sleep() luồng vẫn được cấp phát CPU nhưng không làm gì cả , chúng ta bắt buộc phải đợi hết thời gian quy định luồng mới chạy kể cả dùng từ khóa resume => Thường đi kèm với ngoại lệ muốn sử dụng phải để trong try catch.

=> Suspend() chương trình bị ngừng cấp phát CPU (đây là sự khác biệt lớn nhất so với sleep) muốn luồng chạy lại phải dùng từ khóa resume.

=> Từ khóa wait()  từ khóa này mình đọc chưa hiểu rõ bản chất lắm nhưng mình vẫn có thể trình bày qua đó là nó chờ đợi một điều kiện nào đó được thỏa mãn thì luồng sẽ được chạy lại có 2 từ khóa chính là notify() và notifyall().

=> Từ khóa Dead : Các luồng có thể chết tự nhiên hoặc chết do bị ép buộc (giống con người vl)
+ Chết tự nhiên thì không có quá nhiều điều để nói VD : 1 luồng thực hiện xong tất cả các hành động trong run() thì nó sẽ tự die

+ Chết do bị ép dừng lại : VD chúng ta có thể bắt tất cả các luồng dừng lại khi dùng từ khóa stop.




Trong luồng trên chúng ta dừng chạy luồng với từ khóa sleep từ khóa sleep đi kèm(ném ra) với ngoại lệ là ThreadDead nếu có ngoại lệ xảy ra luồng sẽ bị chết nếu ngoại lệ không xảy ra thì nó cũng sẽ chết bởi vì chúng ta dùng từ khóa stop.

III. Các trạng thái của luồng do java định nghĩa.
Ở phần trên mình đã trình bày về các trạng thái chung nhất của luồng và cách làm cho luồng thoát khỏi trạng thái đó , mô tả sơ qua quá trình hoạt động của luồng . Ở phần này mình sẽ cùng các bạn tìm hiểu về các trạng thái của luồng do java định nghĩa phần này khá dài nên mình sẽ chỉ tóm tắt từng phần sẽ tương đương với các bài học ở phía sau.

Java định nghĩa trạng thái của luồng trong các thuộc tính static trong Threaad.State.

Thread.State.New : Trạng thái như đã trình bày phần trên đây mới là giai đoạn khởi tạo luồng chưa cấp phát sức mạnh CPU.

Thread.State.Runnable : Trạng thái các luồng song song nhau chạy do CPU đảm nhận nhưng thực chất không phải vậy mà là thời gian chuyển luồng rất nhanh cỡ vài nano giây.

Thread.State.BlocK : đây là một trạng thát Not-Runnable. Luồng chờ một đối tượng bị khóa bởi jvm Monitor.

Thread.State.Waiting :đây là một trạng thái Not-Runnable . Luồng đang chờ đợi một notify() từ một  luồng khác.Luồng lúc này rơi và trạng thái wait hoặc join.

Ngoài ra còn có Thread.State.Waiting-Time và Thread.State.TERMINATED.

Các hàm như wait(), join()notify(), và JVM monitor sẽ học ở phần đồng bộ hóa luồng.



 

Nhận xét

Bài đăng phổ biến