Я недавно наткнулся на этот вопрос в нескольких интервью. Это выглядит следующим образом:
У вас есть список потоков чисел, которые вы можете читать из асинхронно. Учитывая поток записи для потребителя, как бы вы прочитали числа из потоков, объединили и отсортировали их и, наконец, записали в выходной поток?
Input:
1. stream 1: 1, 2, 3, 4...
2. stream 2: 1, 2, 3, 4, 5...
Output: 1, 1, 2, 2, 3, 3, 4, 4, 5....
Мы можем предположить, что контракт выглядит следующим образом:
final class Stream {
public interface boolean isClosed();
public interface int read();
}
// utility method to write numbers to consumer stream
public void write(Integer number);
Мои первые мысли об этом вопросе заключались в том, что он похож на буфер кэша LRU . Однако есть 2 проблемы с этим:
- Как объединять и поддерживать порядок и синхронизацию потоков чтения?
- Как убедиться, что числа записаны без каких-либо задержек? Как только запись будет выполнена, порядок записи больше не будет гарантирован для дальнейших чисел в потоке?
Я уверен, что здесь есть оговорка, которую я неправильно истолковал или полностью упустил. Любая помощь в этом была бы отличной. Спасибо.