Một vài thuật ngữ của thread (cơ bản)
thread
3
Java
85
White

LinhPT viết ngày 25/01/2016

Thread join

Hãy xem đoạn code sau đây:

class Demo implements Runnable {
    public void Run() {
        //Do some thing crazy here
    }
}

class Foo {
    public static void runDemo() {
        Demo f = new Demo();
        f.start();
        f.join();
        System.out.println("yay!");
    }
}

Hàm join nhằm mục đích block xử lý của hàm runDemo() cho đến khi thread f chạy xong.
Chính vì thế mặc dù mang cái tên chả liên quan gì cả nhưng về ý nghĩa hàm join có nghĩa là đợi.
Trong đầu mình thì mình hình dung hàm join có tên là waitUntilDone().

Thread yield

yield trong tiếng Anh có nghĩa là chịu thua , nhường. Và trong thực tế thì đúng là nó mang ý nghĩa như vậy.
Hãy xem đoạn code dưới đây

public class MyRunnable implements Runnable {

   public static void main(String[] args) {
      Thread t = new Thread(new MyRunnable());
      t.start();

      for(int i=0; i<5; i++) {
          System.out.println("Inside main");
      }
   }

   public void run() {
      for(int i=0; i<1000; i++) {
          System.out.println("Inside run");
          Thread.yield();
      }
   }
}

Nếu không có yield thì đoạn code trên sẽ in lẫn lộn giữa "Inside main" và "Inside Run" với thứ tự không dự đoán được.
Nhưng nếu có yield thì chúng ta sẽ thấy lần lượt "Inside main", sau khi hết "Inside main" thì sẽ đến "Inside Run".
Tại sao lại vậy nhỉ?

Để cho dễ hiểu thì bạn hãy hình dung yield giống như sau. Giả sử sử dụng yield là một Thread tên là đồng chí X. Thread đồng chí Xrất nhiều việc cần làm, nhưng trong đó chỉ có một số việc là quan trọng thôi, còn lại là một số việc cũng chả quan trọng lắm, nhưng lại tốn rất nhiều tài nguyên.
Khi chạy xong những việc quan trọng, đồng chí X muốn nhường lại tài nguyên cho các đồng chí khác để sử dụng.
Hàm yield chính là cơ chế để thực hiện việc nhường này.
Khi hàm này được gọi, OS sẽ được thông báo là: clock của đồng chí X có thể được sử dụng bởi các đồng chí khác có độ ưu tiên cao hơn, và nhờ đó OS sẽ biết cách để schedule các xử lý sao cho thích hợp.

Từ những lý luận trên bạn có thể thấy là

  • Cần có cơ chế để set độ ưu tiên cho Thread. Ở java sẽ là hàm setPriority(Thread.MIN_PRIORITY); (hoặc là MAX_PRIORITY)
  • Xử lý song song sẽ được thực hiện ở tận tầng instruction chứ không phải block, thực hiện instruction nào trước sau sẽ do OS tuỳ chọn

Một cái hình cũng không dễ hiểu lắm về cơ chế của yield :P, cơ mà mình cứ post vào

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

LinhPT

20 bài viết.
62 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
39 3
Mình thi thoảng phải quản lý linux server, mà trong đó có một số thao tác quản lý quan trong như quản lý đĩa cứng, quản lý mạng, quản lý đường truy...
LinhPT viết 3 năm trước
39 3
White
27 2
(Ảnh) Tiêu đề chỉ là câu khách :v, thực ra là có một vài điểm về mysql explain mà chắc chưa nhiều bạn biết, tớ cũng hay quên nên note lại cho nhớ ...
LinhPT viết 3 năm trước
27 2
White
18 0
Bài viết được dịch từ http://qiita.com/sion_cojp/items/04a2aa76a1021fe77079 Điều cần nhớ trước khi đánh bất kì câu lệnh nào ①Để tránh làm nặng...
LinhPT viết hơn 1 năm trước
18 0
Bài viết liên quan
White
14 0
Không gì đẹp bằng nụ cười khi đôi mắt e lệ nhìn xuống. Victor Hugo Các bạn có thể đọc bài viết gốc tại (Link) Tò mò khi tìm hiểu hoạt động của ...
Đào Văn Hùng viết 12 tháng trước
14 0
White
1 0
Clojure supports flexible concurrency models for real world complexity: (Link): builtin support. (Link): similar to Golang concurrency model, w...
Quan viết hơn 1 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
20 bài viết.
62 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!