Java: Thread.currentThread (). Sleep (x) so với Thread.sleep (x)


86

Tôi có cái này trong mã của mình

Thread.currentThread().sleep(x);

Eclipse yêu cầu tôi sử dụng tĩnh

Thread.sleep(x); 

thay vào đó, tại sao? Sự khác biệt là gì, có sự khác biệt nào đó về chức năng giữa 2 phương pháp này không?


1
có 'Hành động Lưu' trong Eclipse sẽ tự động thay thế quyền truy cập thành viên tĩnh thông qua các biến cá thể bằng quyền truy cập tĩnh thông qua tên lớp - bật Hành động lưu này và nhiều Hành động lưu khác mà bạn đồng ý (ví dụ: loại bỏ các phôi không cần thiết, không cần thiết 'this', v.v.).
les2

Câu trả lời:


135

Chỉ có một phương thức, không phải hai, và nó là tĩnh. Mặc dù bạn có thể gọi một phương thức tĩnh thông qua một tham chiếu cá thể, nhưng đó không phải là kiểu tốt. Nó cho biết lập trình viên nghĩ rằng họ đang gọi một phương thức thể hiện. Một lập trình viên bối rối có thể nghĩ rằng anh ta hoặc cô ta có thể khiến một luồng khác (không phải luồng hiện tại) ngủ theo cách này, khi đó không phải là những gì nó làm.

Cả hai dòng mã của bạn đều làm điều tương tự nhưng thứ hai là phong cách tốt hơn.


24
+1 để đề cập rằng lập trình viên có thể muốn tạo một luồng cụ thể ở chế độ ngủ thông qua someThread.sleep (), điều này thì không.
Chii

32

Trong Java, sleep là một phương thức tĩnh. Cả hai ví dụ của bạn đều thực hiện chính xác những điều tương tự, nhưng phiên bản cũ gây nhầm lẫn vì có vẻ như nó đang gọi một phương thức trên một đối tượng cụ thể nhưng nó không thực hiện điều đó chút nào. Trong ví dụ của bạn, điều đó sẽ không quan trọng lắm, nhưng sẽ nguy hiểm hơn nếu bạn có những điều sau:

someOtherThread.sleep(x);

Lần này có vẻ như bạn đang nói với một số luồng khác ở chế độ ngủ, nhưng thực tế là bạn đang đặt luồng hiện tại ở chế độ ngủ. Cách để tránh mắc lỗi kiểu này là luôn gọi các phương thức tĩnh bằng cách sử dụng lớp thay vì một đối tượng cụ thể.


Ý của bạn là cả currentThread và someOtherThread sẽ chuyển sang chế độ ngủ trong khi thực thi dòng đơn này "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar

3
Không. Luồng hiện tại sẽ chuyển sang chế độ ngủ, bất kể đối tượng Thread .sleep được gọi trên. Bạn không thể đặt các ThreadS khác ở chế độ ngủ (như vậy).
Mô-men xoắn

3

Hai cuộc gọi phương thức giống hệt nhau về hành vi vì chúng gọi cùng một phương thức nhưng sử dụng tên lớp ( Thread trong trường hợp này) thay vì đối tượng để truy cập các trường tĩnh và các phương thức làm cho nội dung tĩnh này rõ ràng. Đó là lý do tại sao cảnh báo này được tạo ra.

Nhưng xem xét rằng các trường và phương thức tĩnh được hiển thị theo một cách cụ thể trong hầu hết các IDE (ví dụ: bằng phông chữ nghiêng trong Eclipse và IntelliJ IDEA), cảnh báo này có còn cần thiết không? Có thể không cần thiết như những ngày đầu của Java mà các trình soạn thảo đơn giản được sử dụng.


0

Thread.currentThread().sleep(x);hoặc theo cách Eclipse nói vì vậy Thread.sleep(x);ngữ cảnh tĩnh là bắt buộc nếu cần thiết, vì vậy chúng tôi chờ đợi một chút thời gian trễ với chế độ ngủ này.

Mô hình tĩnh được thiết lập bởi một đối tượng, chỉ ảnh hưởng đến vòng đời in heap của đối tượng cụ thể đó, một lần nữa xem xét tổng thể Vòng đời đối tượng, tĩnh không phải là điều khó chịu, nếu cần, nó có thể được sử dụng để dễ mã hóa, nhưng được thực hiện cẩn thận như chân tĩnh- print được gọi bởi Class(ví dụ: - Class.forName(pkg.className)) giống như tên chứ không phải bởi bất kỳ objectmà là bản sao in một lần trong thời gian chạy của Lớp trong HEAPbộ nhớ.

Một lần nữa, việc sử dụng đối tượng cũng có ưu và nhược điểm bởi các loại tham chiếu Yếu, Bóng ma, Mạnh ...,

Mã được biến đổi bởi tự nhiên. Nó chỉ là cách chúng tôi làm để làm cho nó hoạt động và hoạt động.


1
Để nói về luồng, - nó sinh ra không đồng bộ, mặc dù chúng ta có thể có những thứ đồng bộ trong luồng. Về bản chất, mọi thứ đều không đồng bộ, mặc dù đôi khi chúng ta tìm thấy những thứ đồng bộ. Không có thứ nào là đồng bộ ngay cả khi chúng ta xâm nhập vào Lượng tử hoặc Thiên văn học.
Dev Anand Sadasivam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.