2010-08-21 30 views
7

sleep() là một phương thức tĩnh của lớp Thread. Làm thế nào nó hoạt động khi được gọi từ nhiều luồng. và làm thế nào nó tìm ra chuỗi hiện hành thực hiện. ?Thread.sleep() hoạt động như thế nào khi được gọi từ nhiều luồng

hoặc có thể là một câu hỏi chung chung hơn sẽ là phương pháp tĩnh được gọi từ các chủ đề khác nhau như thế nào? Sẽ không có bất kỳ vấn đề tương tranh nào?

Trả lời

6

làm cách nào để tìm ra luồng thực thi hiện tại?

Nó không phải. Nó chỉ gọi hệ điều hành, mà luôn luôn ngủ thread gọi nó.

+1

+1: Tôi không thể tìm thấy các từ chính xác. –

5

Phương thức sleep ngủ luồng hiện tại vì vậy nếu bạn đang gọi nó từ nhiều luồng, nó sẽ ngủ mỗi chủ đề đó. Ngoài ra còn có phương thức tĩnh currentThread cho phép bạn nhận được chuỗi thực hiện hiện tại.

-1

Thread.sleep(long) được triển khai tự nhiên trong lớp java.lang.Thread. Dưới đây là một phần của doc API của nó:

Causes the currently executing thread to sleep (temporarily cease 
execution) for the specified number of milliseconds, subject to 
the precision and accuracy of system timers and schedulers. The thread 
does not lose ownership of any monitors. 

Phương pháp ngủ ngủ thread mà gọi nó (Dựa trên ý kiến ​​EJP của) xác định các chủ đề hiện đang thực hiện (mà gọi nó và gây ra nó để ngủ).. Các phương pháp Java có thể xác định chuỗi nào đang thực thi nó bằng cách gọi Thread.currentThread()

Phương thức (tĩnh hoặc không tĩnh) có thể được gọi từ bất kỳ số lượng luồng nào cùng một lúc. Threre sẽ không có bất kỳ vấn đề tương tranh nào miễn là phương pháp của bạn là thread safe. Bạn sẽ gặp sự cố chỉ khi nhiều Chủ đề sửa đổi trạng thái nội bộ của lớp hoặc cá thể mà không cần đồng bộ hóa thích hợp.

+0

@naikus implentation của lớp Thread nói giấc ngủ là phương pháp tự nhiên. Bất kỳ ý tưởng làm thế nào để mã nguồn gốc xác định những gì thread để ngủ? – YoK

+0

@Naikus. Những gì tôi muốn biết là, làm thế nào là mã trong các phương pháp tĩnh chạy trong phạm vi thread. Sẽ có một bản sao của mỗi phương pháp được nạp vào ngăn xếp của thread? – JWhiz

+0

@YoK, tôi không chắc chắn nhưng có thể nó gọi một phương thức gốc Thread.currentThread();). Chắc chắn bạn biết về nó. – naikus

0

Câu hỏi chung chung hơn là phương thức tĩnh được gọi từ các chuỗi khác nhau như thế nào? Sẽ không có bất kỳ vấn đề tương tranh nào?

Chỉ có một vấn đề tương tranh tiềm năng nếu một hoặc nhiều luồng sửa đổi trạng thái được chia sẻ trong khi một chuỗi khác sử dụng cùng một trạng thái. Không có trạng thái chia sẻ cho phương thức sleep().

-1

Khi máy ảo gặp sự cố sleep(long), nó sẽ làm gián đoạn Chủ đề hiện đang chạy. "Chủ đề hiện tại" vào thời điểm đó luôn là luồng được gọi là Thread.sleep(). Sau đó, nó nói:

Hey! Không có gì để làm trong chủ đề này (Bởi vì tôi phải đợi). Tôi sẽ tiếp tục một Chủ đề khác.

Thay đổi chủ đề được gọi là "mang lại". (Lưu ý: bạn có thể tự kiếm tiền bằng cách gọi Thread.yield();)

Vì vậy, nó không phải tìm ra Chủ đề hiện tại là gì. Nó luôn luôn là Chủ đề được gọi là sleep(). Lưu ý: Bạn có thể nhận được các thread hiện hành bằng cách gọi Thread.currentThread();

Một ví dụ nhỏ:

// here it is 0 millis 
blahblah(); // do some stuff 
// here it is 2 millis 
new Thread(new MyRunnable()).start(); // We start an other thread 
// here it is 2 millis 
Thread.sleep(1000); 
// here it is 1002 millis 

MyRunnable phương pháp run() của nó:

// here it is 2 millis; because we got started at 2 millis 
blahblah2(); // Do some other stuff 
// here it is 25 millis; 
Thread.sleep(300); // after calling this line the two threads are sleeping... 
// here it is 325 millis; 
... // some stuff 
// here it is 328 millis; 
return; // we are done; 
+0

Không có 'gián đoạn'. – EJP

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