Первая проблема с вашим кодом заключается в том, что вы создаете итератор для основного потока, прежде чем какие-либо записи будут добавлены в Hashtable
. Для этого особого случая метод entrySet().iterator()
возвращает java.utils.Collections.EmptyIterator
, метод hasNext()
которого всегда возвращает false.
Если вы создадите итератор непосредственно перед циклом while, основной поток также вернет записи из Hashtable
:
it=t.entrySet().iterator();
while(it.hasNext()){
out.println("Parent thread");
//...
}
Но это приводит только к чередующемуся выводу:
Parent thread
Child thread
5=e
5=e
Child thread
4=d
Parent thread
4=d
Child thread
3=c
Почему? Поскольку методы доступа Hashtable
(например, put
, putAll
, get
, size
и т. Д.) Синхронизированы, итераторы, которые вы можете создать , вообще не синхронизируются , за исключением remove
метод.
Особенно итерации по Hashtable
не мешают другим потокам итерировать по нему, как вы, вероятно, ожидаете.