2012-09-10 12 views
21

Đâ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.

+3

Đâ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ợ. –

+0

Bạn có thể hiển thị stacktrace của luồng trong trạng thái 'WAITING' không? – axtavt

+0

Bạn có thể viết một chương trình đơn giản có thể sinh sản không. –

Trả lời

3

Đó là sự cố [khó chịu] đã được giải quyết trong các phiên bản đầu của Java 7. Nếu bạn di chuyển sang JVM mới hơn, bạn sẽ không gặp phải sự cố đó (có vẻ như bản sửa lỗi chưa được chuyển sang Java 6).

Xem herehere.