Xử lý messages queue trong đa luồng

Em có đề bài như thế này ạ :
Viết chương trình giải quyết bài toán producer & consumer với các yêu cầu sau:
– Có một message queue chứa các message, cấu trúc message là tùy chọn. Message queue có size giới hạn.
– Một thread đóng vai trò producer: producer định kỳ sẽ tạo ra một message và đưa vào message queue, nếu msgq đã full thì thread sẽ phải đợi cho tới khi msgq không ở trong trạng thái full và tiếp tục tạo message mới đưa vào queue.
– Một thread đóng vai trò consumer: mỗi lần sẽ lấy ra 1 message từ message queue và in message ra màn hình, nếu message queue đang empty thì sẽ phải đợi cho tới khi có message trong queue để xử lý.

Em bị vướng chỗ để thread đợi khi messages queue rỗng hoặc full, em có thử dùng synchronize, wait, notify nhưng 2 thread Producer, Consumer sẽ add và poll lần lượt nên ko thể dẫn đến tình trạng full hay empty được. Còn nếu em ko dùng synchronize mà chỉ code như phía dưới thì em thấy 2 thread ko “đợi”. Mong mn giúp đỡ ạ

@Override
//Producer
public void run() {
        int count = 0;
        while (true) {
                try {
                    if (!limitedQueue.isFull()) {
                        count++;
                        limitedQueue.add(String.valueOf(count));
                        System.out.println("Messages Queue : " + limitedQueue);
                    }
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    }
}


@Override
// Consumer
public void run() {
    int sleepTime = 4000;
    while (true) {
            try {
                // if queue is not empty
                if (limitedQueue.size() != 0) {
                    System.out.println("Message just took : " + limitedQueue.poll());
                    Thread.sleep(sleepTime);
                } else {
                    System.out.println("Messages Queue empty!");
                    Thread.sleep(sleepTime);
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
}

Trước hết để loại bỏ việc thực hiện “đồng bộ” thì thời gian “ngủ” bạn phải tạo ngẫu nhiên. Bạn làm như trên, producer cứng là 1 giây, consumer cứng là 4 giây, có nghĩa, sẽ đến nào đó thì hàng đợi luôn đầy; nói dễ hiểu là cung vượt cầu. Ngược lại, p chậm hơn c thì cung không đủ cầu, hàng đợi hầu hết là trống.

Việc tạo thời gian ngẫu nhiên bạn cũng chỉ tạo bên p là đủ, nhưng đảm bảo phải tạo trong khoảng gồm nhanh hơn và chậm hơn so với c.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?