2 Answers
- Sử dụng blocking queue:
while(true) { Request request = blockingQueue.take(); }
Ưu điểm:
- Không phải mất thời gian sleep, khi có request gửi đến là có thể lấy ra xử lý luôn
- Đối với các trường hợp cần kiểm tra max capacity sẽ rất tiện
Nhược điểm:
- Mỗi lần chỉ lấy ra được request để xử lý
- Không thể thực hiện 1 việc gì đó định kỳ do bị block nếu queue rỗng
- Không thể handle nhiều queue cùng 1 lúc
- Sử dụng queue thường
List buffer = new ArrayList(); while(true) { doSomething(); if(synchronizedQueue.isEmpty()) { Thread.sleep(time); } else { buffer.clear(); buffer.addAll(synchronizedQueue); processBatchRequests(buffer); } processQueue2(queue2); }
Ưu điểm:
- Có thể lấy ra nhiều request để xử lý 1 lúc
- Có thể thực hiện 1 việc gì đó định kỳ: Cái này phù hợp cho các framework client, khi luôn phải được gọi định kỳ để thông báo cho các hàm async và update state để hiển thị UI
Nhược điểm:
- Bị sleep một khoảng thời gian, trong lúc đó hoàn toàn có thể đã có request đến và nó không được xử lý ngay.
- Nếu muốn kiểm tra max capacity queue vẫn được, tuy nhiên do bị delay việc xử lý nên việc kiểm tra này không chính xác tuyệt đối.
Như vậy với các ứng dụng server, nơi phải ưu tiên việc xử lý request thì nên chọn phương án 1 blocking queue vì server cũng có thể tạo nhiều thread.
Đối với các ứng dụng client thì nên chọn phương án 2 vì phải định kỳ thông báo cho các hàm async và state để update UI, thêm nữa client cũng hạn chế thread, nên có thể sử dụng 1 thread duy nhất để loop tất cả các queue.
Đối với ezyfox-server có hỗ trợ cơ chế anti-flooding để chống DDoS nên cần kiểm tra max queue capacity thì phương án 1 lại càng cần thiết hơn.
-
0
time bao nhiêu là hợp lý a nhỉ? giả sử e có 4 thread event loop, 1k thread, 100k thread
-
0