О втором вопросе: когда ваша программа запускается, объект Q «пуст», что означает, что нет объекта, который мог бы получить потребитель.Таким образом, потребитель должен ждать, пока производитель что-то вставит. Это означает, что производитель сначала напечатает свой «Put», затем потребитель может извлечь его и напечатать свой «Get».
С другой стороны, еслипроизводитель пытается снова что-то поместить до того, как потребитель вынул предыдущий элемент из очереди, производитель должен ждать, пока он не будет взят.
Это означает, что вы получите чередующиеся выходные данные "Put" и "Get"(при условии, что выходной поток не выполняет некоторое переупорядочение).
Это немного отличается от SynchronousQueue
тем, что здесь производитель может продолжить работу, если очередь ранее была пустой (и потребитель может продолжить работу, если она была заполнена ранее).), тогда как для SynchronousQueue он будет ждать, пока потребитель не будет готов принять его (что означает, что put
и get
всегда перекрываются во времени и не могут быть вызваны в одном потоке).
Ваша очередь больше похожа на ArrayBlockingQueue с емкостью 1.