为什么在子线程之后不执行父线程?

时间:2019-03-23 07:52:18

标签: java multithreading iterator hashtable

我编写了一些代码,以同时通过两个线程遍历线程安全的m。预计一次只能从以下代码中读取一个线程-

 while(mysqli_fetch_array($h,$link))

输出是程序终止之后的结果-

Hashtable

为什么父线程在此之后不执行?任何线索都将有所帮助,将不胜感激。

1 个答案:

答案 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(如putputAllgetsize等访问方法是同步的,所以您可以创建的迭代器是除了remove方法之外,通常不会同步。

特别是在Hashtable上进行迭代并不能阻止其他线程像您期望的那样对其进行迭代。

相关问题