Tôi sử dụng CountDownLatch để chờ một sự kiện nhất định từ một thành phần khác (chạy trong một chuỗi khác). Các phương pháp sau đây sẽ phù hợp với ngữ nghĩa của phần mềm của tôi, nhưng tôi không chắc liệu nó hoạt động như một tôi mong đợi:Nhiều cuộc gọi đến CountDownLatch.await (int) với timeout
mCountDownLatch.await(3000, TimeUnit.MILLISECONDS)
otherComponent.aStaticVolatileVariable = true;
mCountDownLatch.await(3500, TimeUnit.MILLISECONDS);
... <proceed with other stuff>
Kịch bản nên là như sau: Tôi chờ đợi trong 3 giây, và nếu chốt là không được tính đến 0, tôi thông báo cho thành phần khác với biến đó, và sau đó tôi đợi tối đa 3,5 giây. Nếu có thời gian chờ một lần nữa, sau đó tôi không quan tâm và sẽ tiến hành các hoạt động khác.
Lưu ý: Tôi biết nó không giống như vậy, nhưng kịch bản trên hoàn toàn hợp lý và hợp lệ trong phần mềm của tôi.
Tôi đã đọc tài liệu chờ đợi (int, TimeUnit) và CountDownLatch, nhưng tôi không phải là chuyên gia Java/Android, vì vậy tôi cần xác nhận. Đối với tôi, tất cả các kịch bản tìm kiếm hợp lệ:
- Nếu chờ đợi đầu tiên thành công, sau đó người kia chờ đợi sẽ trở lại ngay lập tức
- Nếu chờ đợi đầu tiên lần ra ngoài, thì chờ đợi khác là vẫn còn hiệu lực; do đó, nếu các chủ đề khác chú ý đến tín hiệu tĩnh, thứ hai chờ đợi có thể trở thành công
- Cả hai đang chờ đợi cuộc gọi thời gian ra (điều này là tốt theo ngữ nghĩa phần mềm của tôi)
Tôi có sử dụng chờ đợi (.. .) đúng không? Có thể một giây chờ đợi (...) được sử dụng theo cách trên ngay cả khi một chờ đợi trước đó (...) trên cùng một đối tượng hết thời gian?
Cám ơn các mã rất kỹ lưỡng. Trên thực tế, câu hỏi của tôi đơn giản hơn nhiều so với điều này, nhưng nếu tôi đúng, bạn thực sự * đã chứng minh * rằng giả định của tôi là chính xác, vì vậy một lời cảm ơn lớn cho điều đó! Câu hỏi cốt lõi của tôi chỉ là điều này: nếu lần đầu tiên chờ đợi() ** lần ** đối với một đối tượng, tôi có thể gọi await() một lần nữa trên cùng một đối tượng (như trong mã của tôi) không? Tôi cho là có, nhưng như tôi đã nói, tôi không phải là một chuyên gia Java. (Sau khi tôi nhận được xác nhận cuối cùng, tôi chắc chắn sẽ đánh dấu câu trả lời của bạn là câu trả lời, bởi vì nó nhiều hơn những gì tôi cần.) –
Heh, thành thật mà nói, tôi không chắc chắn 100% câu trả lời ở đầu đầu của tôi, và cách tốt nhất để tìm câu trả lời như thế là thử nó. Do đó thử nghiệm :) –