2016-11-10 13 views
6

Kịch bản: Nhà sản xuất của tôi điền vào mảng, nói năng lực mới int [10], trước khi người tiêu dùng của tôi có cơ hội để tiêu thụ bất kỳ. Nhà sản xuất của tôi thấy mảng đầy và khối.Làm thế nào để ArrayBlockingQueue tránh xáo trộn các phần tử mảng?

Sau đó, người tiêu dùng của tôi đến và loại bỏ int [0], và tín hiệu cho nhà sản xuất rằng mảng hiện có một khe trống để lấp đầy.

Nhà sản xuất của tôi tỉnh dậy và cố gắng thêm phần tử mới vào mảng. Xem xét chỉ int [0] là miễn phí, và chúng tôi đang thực hiện FIFO, không ArrayBlockingQueue trộn tất cả các yếu tố còn lại 9 bên trái, điền 0-8 chỉ số và để lại int [9] miễn phí cho nhà sản xuất?

tôi đã xem xét việc thực hiện nhưng không thấy bất kỳ chức năng mảng sao chép,

Trả lời

5

Không sao chép các phần tử mảng được thực hiện, bởi vì ArrayBlockingQueue sử dụng các mảng như một bộ đệm tròn. Nó duy trì hai chỉ mục, takeIndexputIndex và kết thúc chúng xung quanh khi chúng đến cuối mảng.

Sau khi phẫu thuật có thêm hoặc mất một yếu tố mà họ gọi là phương pháp tin "tăng" gọi inc, mà kết thúc tốt đẹp chỉ số xung quanh cuối cùng:

final int inc(int i) { 
    return (++i == items.length)? 0 : i; 
} 

Dưới đây là một ví dụ về cách phương pháp này được sử dụng:

private void insert(E x) { 
    items[putIndex] = x; 
    putIndex = inc(putIndex); // <<== Wraps around 
    ++count; 
    notEmpty.signal(); 
} 
+0

Làm thế nào rất thông minh. – TheCoder

0

ArrayBlockingQueue duy trì hai biến giả frontIndexrearIndex để xử lý này thay vì chuyển el ement. Nếu hàng đợi đầy. và bất kỳ yếu tố được kéo lên bởi người tiêu dùng từ chỉ số a [0] thì rearIndex chuyển đến chỉ số và thời gian tiếp theo bất cứ khi nào nhà sản xuất cố gắng thêm bất kỳ yếu tố frontIndex sẽ được chuyển đến các chỉ số sau chỉ số . và thao tác đặt tiếp theo sẽ được thực hiện trên a [0].

Ở đây FrontIndex == RearIndex có nghĩa là hàng đợi đã đầy.

Các vấn đề liên quan