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);
}
}
}