Tôi đang viết một ứng dụng liên quan đến việc viết các khối dữ liệu lớn đáng kể vào một OutputStream (thuộc một Socket). Điều làm cho điều này phức tạp hơn một chút là thường có nhiều luồng cố gắng ghi vào cùng một OutputStream. Hiện tại, tôi có nó được thiết kế sao cho OutputStream mà dữ liệu đang được ghi vào trong chủ đề của nó. Luồng chứa một hàng đợi (LinkedList), nó thăm dò các mảng byte và viết chúng càng sớm càng tốt.Viết đồng thời theo Chuẩn OutputStream
private class OutputStreamWriter implements Runnable {
private final LinkedList<byte[]> chunkQueue = new LinkedList<byte[]>();
public void run() {
OutputStream outputStream = User.this.outputStream;
while (true) {
try {
if (chunkQueue.isEmpty()) {
Thread.sleep(100);
continue;
}
outputStream.write(chunkQueue.poll());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Vấn đề với thiết kế này là càng ngày càng nhiều dữ liệu xảy ra, càng ngày càng có nhiều dữ liệu xếp hàng và không được ghi nhanh hơn. Ban đầu, khi dữ liệu được đưa vào hàng đợi, nó được viết thực tế ngay lập tức. Sau khoảng 15 giây, dữ liệu bắt đầu tụt lại phía sau; sự chậm trễ phát triển từ thời điểm dữ liệu được xếp hàng đợi đến thời điểm dữ liệu thực sự được ghi. Khi thời gian trôi đi, sự chậm trễ này trở nên lâu hơn và lâu hơn. Đó là rất đáng chú ý.
Một cách để khắc phục điều này sẽ là một loại triển khai ConcurrentOutputStream cho phép dữ liệu được gửi mà không bị chặn để ghi không bắt đầu được sao lưu (heck, hàng đợi sẽ không cần thiết). Tôi không biết nếu có một sự thực hiện như vậy - tôi đã không thể tìm thấy một - và cá nhân tôi không nghĩ rằng nó thậm chí có thể viết một.
Vì vậy, không ai có bất kỳ đề xuất nào về cách tôi có thể thiết kế lại điều này?
Điều đó không mang tính xây dựng. Có gì sai với nó? –
BufferedOutputStream? –
Ngoài ra, bạn có đang đồng bộ hóa các sửa đổi đối với danh sách liên kết của mình không? Bởi vì nó không phải là chủ đề an toàn bởi thiết kế. Ngoài ra, loại luồng đầu ra nào bạn đang xếp chồng lên trên đầu ra của ổ cắm và bạn đang đẩy bao nhiêu dữ liệu vào nó? – Perception