我有这个练习,但我不明白正确答案的原因:
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
public class Cache {
static ConcurrentHashMap<String, Object> chm = new ConcurrentHashMap<String, Object>();
public static void main(String[] args) {
chm.put("a", "aaa");
chm.put("b", "bbb");
chm.put("c", "ccc");
new Thread(){
public void run(){
Iterator<Entry<String, Object>> it = Cache.chm.entrySet().iterator();
while(it.hasNext()){
Entry<String, Object> en = it.next();
if(en.getKey().equals("a") || en.getKey().equals("b")){
it.remove();
}
}
}
}.start();
new Thread(){
public void run(){
Iterator<Entry<String, Object>> it = Cache.chm.entrySet().iterator();
while(it.hasNext()){
Entry<String, Object> en = it.next();
System.out.print(en.getKey()+", ");
}
}
}.start();
}
}
有4个可能的答案:
这个练习的正确答案是3。
为什么这是正确的答案?
我认为这个练习可以打印任意组合键,因为这个主要有两个线程,所以我不知道两者中哪一个会先启动。如果第二个线程将首先启动,我将拥有ConcurrentHashMap中的所有键,因此它将打印a和b。所以,我对这个练习的答案是1.但是练习认为这是错误的答案。为什么?
我如何确定哪个线程将首先启动?
非常感谢!
一个。
没有办法事先确定哪个线程首先会创建一个线程。
它只取决于Scheduler
,它是JVM
的一部分。它管理Thread
s。
如果你想等到第一个线程然后开始第二个线程,你可以轻松使用firstThread.join()
,然后启动第二个线程。
我们无法确定首先运行哪个线程。它完全依赖于作为JVM一部分的Scheduler。
如果你想以顺序方式(一个接一个)执行两个线程运行,那么使用wait和notify来实现它(比如生产者消费者问题)。