Đây là mã của tôi:Tại sao LinkedBlockingQueue # poll() có thể bị treo?
// in constructor
BlockingQueue<Node> queue = new LinkedBlockingQueue<Node>();
// later in another thread
Node node = queue.poll(1, TimeUnit.SECONDS);
Thông thường nó hoạt động, nhưng đôi khi, trong một số trường hợp (vẫn không biết khi nào và tại sao) poll()
phương pháp không trả lại NULL
nhưng giữ chủ đề của nó trong WAITING
nhà nước mãi mãi. Tại sao và làm thế nào điều này có thể xảy ra?
Tôi đã thử ArrayBlockingQueue
- cùng một hiệu ứng. Tôi đang sử dụng OpenJDK trên Mac OS:
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b06)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
Cùng một mã hoạt động tốt với Oracle Java 1.6 trên Mac OS. Đây là nơi các chủ đề đang bị mắc kẹt:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:894)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1221)
java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:340)
java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:462)
Điều thú vị là khi tôi interrupt()
chủ đề này và cố gắng poll()
một lần nữa tôi đạt được tình cảnh tương tự ngay lập tức.
Đây có thể là lỗi, tôi sẽ thử phiên bản mới nhất của OpenJDK 7 hoặc Oracle Java 7 update 7. Vì điều này sử dụng một cuộc gọi hệ thống, tôi cũng đảm bảo rằng bạn có phiên bản hệ điều hành được hỗ trợ. –
Bạn có thể hiển thị stacktrace của luồng trong trạng thái 'WAITING' không? – axtavt
Bạn có thể viết một chương trình đơn giản có thể sinh sản không. –