我有这个练习,但是我不明白正确答案的原因:
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。但是该练习将其视为错误答案。为什么?
如何确定哪个线程首先开始?
非常感谢!
A。
答案 0 :(得分:2)
除了先创建一个线程外,无法预先确定哪个线程将首先启动。
它仅取决于Scheduler
中的JVM
。它负责Thread
的管理。
如果要等待第一个线程然后启动第二个线程,可以轻松使用firstThread.join()
然后启动第二个线程。
答案 1 :(得分:1)
我们无法确定首先运行哪个线程。这完全取决于JVM中的Scheduler。
如果要以顺序方式(两个接一个地)执行两个线程,则请使用wait并通知以实现此操作(例如生产者使用者问题)。