2012-05-01 36 views
27

Trong một số trường hợp, hầu hết chúng ta viết những điều như thế này:Java: LockSupport.parkNanos vs Thread.sleep (...)

try { 
    Thread.sleep(2000); 
} catch (InterruptedException e) { 
    ; // do nothing 
} 

Cho dù đúng hay sai, có thể chấp nhận chỉ trong một số khai thác thử nghiệm, không phải là quan điểm của tôi. Quan điểm của tôi là cùng mã có thể được viết tay, ngắn gọn hơn, như:

LockSupport.parkNanos(2000* 1000000); 

là có bất kỳ lý do tại sao tôi nên ủng hộ một cách tiếp cận trong khác.

Trả lời

14

Tài liệu cho phương thức parkNanos cung cấp các điều kiện trong đó phương thức có thể trả về. Một trong những điều kiện đó là: cuộc gọi giả mạo (nghĩa là, không có lý do gì) trả lại. Vì vậy, về cơ bản nó là OK để sử dụng nó nếu bạn không nhớ giả mạo thức dậy và một số chủ đề khác "unparking" các chủ đề chờ đợi xem xét. Và tất nhiên, nhận xét của Jon khá nhiều về lý do cho việc thích cái khác.

0

LockSupport có ứng dụng hạn chế hơn nhiều và không hỗ trợ xử lý Ngoại lệ. Nếu bạn chỉ phải khóa một sợi đơn, nó là OK.

Từ API:

các phương pháp này được thiết kế để được sử dụng như công cụ để tạo tiện ích đồng bộ cấp cao hơn, và không phải ở bản thân hữu ích đối với hầu hết các ứng dụng kiểm soát đồng thời.

+6

Hầu hết thời gian xử lý ngoại lệ là khá nhiều vô ích. Các coder có thể đảm bảo rằng các chủ đề sẽ không bị gián đoạn ... do đó câu hỏi của tôi – Zo72

11

Dễ đọc: Thread.sleep có ý nghĩa khá trực quan. Làm cách nào để bạn mô tả (cho một nhà phát triển khác) việc sử dụng của bạn là LockSupport.parkNanos? Nếu mô tả đó chủ yếu bao gồm "Tôi muốn chủ đề hiện tại đến ngủ" thì chắc chắn Thread.sleep có tính mô tả hơn.

Sự đồng nhất xuất phát từ việc thiếu xử lý gián đoạn - vì vậy hãy tạo phương thức trình bao bọc để thực hiện việc này nếu bạn muốn, tuyên truyền ngoại lệ là RuntimeException. Heck, nếu bạn đang tạo ra một phương pháp wrapper, bạn có thể sử dụng hoặc thực hiện, mặc dù một thread có thể tất nhiên unpark của bạn "ngủ" thread trong cùng một cách như nó có thể làm gián đoạn nó ...