我编写了一些代码,以同时通过两个线程遍历线程安全的m
。预计一次只能从以下代码中读取一个线程-
while(mysqli_fetch_array($h,$link))
输出是程序终止之后的结果-
Hashtable
为什么父线程在此之后不执行?任何线索都将有所帮助,将不胜感激。
答案 0 :(得分:2)
代码的第一个问题是在将任何条目添加到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
上进行迭代并不能阻止其他线程像您期望的那样对其进行迭代。