2012-03-14 40 views
43

Như hiện đang thực hiện chủ đề trong khi nó gặp cuộc gọi [sleep][1](); sau đó sợi di chuyển ngay vào trạng thái ngủ nơi như cho [yield][2](); chủ đề di chuyển vào trạng thái/trạng thái sẵn sàng Runnablesự khác biệt giữa phương pháp ngủ và phương pháp năng suất đa luồng là gì?

+1

javadoc của họ nói gì? –

+1

Quy tắc ngón tay cái: 1) không bao giờ sử dụng 'yield()'; 2) sử dụng 'sleep()' chỉ khi chương trình được * rõ ràng * cần thiết để chờ một lượng thời gian cụ thể (nếu bạn chỉ cần "chờ một chút", nhiều khả năng là bạn đang làm sai và bạn cần để triển khai cơ chế chờ/báo hiệu thích hợp). –

Trả lời

78

sleep() làm cho luồng chắc chắn ngừng thực thi trong một khoảng thời gian nhất định; nếu không có luồng hoặc quy trình nào khác cần chạy, CPU sẽ không hoạt động (và có thể vào chế độ tiết kiệm năng lượng).

yield() về cơ bản có nghĩa là luồng không làm bất kỳ điều gì đặc biệt quan trọng và nếu có bất kỳ chủ đề hoặc quy trình nào khác cần phải chạy, chúng sẽ cần. Nếu không, luồng hiện tại sẽ tiếp tục chạy.

117

Chúng ta có thể ngăn chặn một sợi từ thực hiện bằng cách sử dụng bất kỳ của 3 phương pháp của chủ đề lớp:

  1. yield()
  2. join()
  3. sleep()
  1. yield() phương pháp tạm dừng thread hiện đang thực hiện tạm thời đã cho một cơ hội để các chủ đề chờ đợi còn lại của ưu tiên như nhau để thực thi. Nếu không có chủ đề chờ đợi hoặc tất cả các chủ đề chờ đợi có mức ưu tiên thấp hơn thì cùng một luồng sẽ tiếp tục thực thi. Các thread được tạo ra khi nó sẽ có cơ hội thực hiện được quyết định bởi bộ lập lịch trình thread có hành vi là nhà cung cấp phụ thuộc.

  2. join() Nếu bất kỳ chuỗi thực hiện nào t1 gọi join() trên t2 i; t2.join() ngay lập tức t1 sẽ nhập vào trạng thái chờ cho đến khi t2 hoàn thành việc thực thi.

  3. sleep() Dựa trên yêu cầu của chúng tôi, chúng tôi có thể tạo chủ đề ở trạng thái ngủ trong một khoảng thời gian nhất định (hy vọng không cần phải giải thích nhiều về phương pháp yêu thích của chúng tôi).

+2

Cũng chờ một số đối tượng đồng bộ hóa như một mutex. – Nick

+0

giải thích tốt đẹp, cảm ơn Anantha. – Amit

3

Giấc ngủ khiến cho chuỗi chỉ bị treo trong x mili giây khi năng suất tạm dừng luồng và di chuyển ngay đến hàng đợi sẵn sàng (hàng đợi CPU sử dụng để chạy chuỗi).

27

Sleep() khiến cho chuỗi hiện đang thực thi ngủ (tạm ngừng thực thi).

Yield() khiến đối tượng chuỗi đang thực hiện tạm dừng và cho phép các luồng khác thực thi.

enter image description here

đọc this cho một lời giải thích tốt về chủ đề này.

+12

Có lỗi trong luồng này: từ trạng thái Ngủ đến Sẵn sàng để chạy, chúng tôi sử dụng ngắt() thay vì thông báo() và thông báoAllAll() – NguyenDat

+1

biểu đồ đẹp về luồng luồng. – Mdhar9e

+0

biểu đồ đẹp, nó giúp tôi hiểu vòng đời của sợi sâu hơn và rõ ràng hơn. – Amit

0

sleep() làm cho luồng chắc chắn ngừng thực thi trong một khoảng thời gian nhất định; nếu không có luồng hoặc quy trình nào khác cần chạy, CPU sẽ không hoạt động (và có thể vào chế độ tiết kiệm năng lượng). yield() về cơ bản có nghĩa là luồng không làm bất cứ điều gì đặc biệt quan trọng và nếu có bất kỳ luồng hoặc quy trình nào khác cần phải chạy, chúng nên chạy. Nếu không, luồng hiện tại sẽ tiếp tục chạy.

Tham khảo http://preciselyconcise.com/java/concurrency/b_sleep.php

5

Năng suất: sẽ làm cho thread để chờ cho thread hiện đang thực hiện và các chủ đề mà đã gọi là năng suất() sẽ tự gắn nó vào cuối thực hiện chủ đề. Chủ đề gọi là yield() sẽ ở trạng thái Blocked cho đến lượt nó.

Chế độ ngủ: sẽ khiến luồng ngủ ở chế độ ngủ trong khoảng thời gian được đề cập trong đối số.

Tham gia: t1 và t2 là hai luồng, t2.join() được gọi là sau đó t1 đi vào trạng thái chờ cho đến khi t2 hoàn thành việc thực thi. Sau đó t1 sẽ vào trạng thái runnable, sau đó trình lập lịch trình thread JVM chuyên dụng của chúng ta sẽ chọn t1 dựa trên các tiêu chí.

1

Lợi nhuận: Đây là gợi ý (không phải bảo đảm) cho bộ lập lịch mà bạn đã thực hiện đủ và một số luồng khác có cùng mức độ ưu tiên có thể chạy và sử dụng CPU.

Thread.sleep();

Giấc ngủ: Nó chặn việc thực hiện chuỗi cụ thể đó trong một thời gian nhất định.

TimeUnit.MILLISECONDS.sleep (1000);

Các vấn đề liên quan