你如何确定哪个线程将首先 运行?
How do you figure out which thread will run first?
我有这个练习题,但我不明白正确答案的原因:
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 个可能的答案:
- 它可以打印任何键的组合。
- 它可以打印任何组合,除了:c,
- 它可以打印任何组合,除了:a, or b, or a, b, or b, a
- 它可以打印任何组合,除了:b, c,
本练习的正确答案是 3。
为什么这是正确答案?
我认为这个练习可能会打印任意键的组合,因为这个主线程中有两个线程,所以我不知道这两个线程中的哪一个会先启动。如果第二个线程首先启动,我将拥有 ConcurrentHashMap 中的所有键,因此它将打印 a 和 b。
所以,我对这个练习的答案是 1。但是这个练习认为它是错误的答案。为什么?
如何确定哪个线程先启动?
非常感谢!
A.
除了先创建线程之外,无法提前确定哪个线程先启动。
它仅取决于 Scheduler
,它是 JVM
的一部分。它进行 Thread
管理。
如果您想等待第一个线程然后启动第二个线程,您可以轻松地使用 firstThread.join()
然后启动第二个线程。
我们无法确定哪个线程是第一个 运行。这完全取决于作为 JVM 一部分的调度程序。
如果你想按顺序执行两个线程运行(一个接一个)然后使用等待和通知来实现这个(就像生产者消费者问题)。
我有这个练习题,但我不明白正确答案的原因:
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 个可能的答案:
- 它可以打印任何键的组合。
- 它可以打印任何组合,除了:c,
- 它可以打印任何组合,除了:a, or b, or a, b, or b, a
- 它可以打印任何组合,除了:b, c,
本练习的正确答案是 3。
为什么这是正确答案?
我认为这个练习可能会打印任意键的组合,因为这个主线程中有两个线程,所以我不知道这两个线程中的哪一个会先启动。如果第二个线程首先启动,我将拥有 ConcurrentHashMap 中的所有键,因此它将打印 a 和 b。 所以,我对这个练习的答案是 1。但是这个练习认为它是错误的答案。为什么?
如何确定哪个线程先启动?
非常感谢!
A.
除了先创建线程之外,无法提前确定哪个线程先启动。
它仅取决于 Scheduler
,它是 JVM
的一部分。它进行 Thread
管理。
如果您想等待第一个线程然后启动第二个线程,您可以轻松地使用 firstThread.join()
然后启动第二个线程。
我们无法确定哪个线程是第一个 运行。这完全取决于作为 JVM 一部分的调度程序。
如果你想按顺序执行两个线程运行(一个接一个)然后使用等待和通知来实现这个(就像生产者消费者问题)。