Bob*_*r02 0 java multithreading
我试图测试关于跨多个线程共享的迭代器的一些事情.我写了一个非常简单(而且非常愚蠢)的程序,该程序应该在不同的线程中遍历相同的映射.这是代码:
final Map<Integer, Integer> m = new HashMap<Integer, Integer>();
final Random r = new Random();
for(int i = 0; i< 1000 ; i++){
m.put(r.nextInt(10000), r.nextInt(10000));
}
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Iterator<Integer> it = m.keySet().iterator();
it.next();
for(Integer i : m.keySet()){
System.out.println("T1 " + i);
try {
Thread.sleep(r.nextInt(100));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Iterator<Integer> it = m.keySet().iterator();
it.next();
for(Integer i : m.keySet()){
System.out.println("T2 " + i);
try {
Thread.sleep(r.nextInt(100));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t1.run();
t2.run();
Run Code Online (Sandbox Code Playgroud)
现在,当我运行这个时,我希望得到某种并发修改的异常,或者在控制台中混合使用"T1"和"T2"消息.会发生什么是我的程序从线程1的映射输出所有值,然后THEN进入线程2.为什么这种可序列化行为就是这里的情况?
你需要调用t1.start()和t2.start()而不是run.
调用run只会执行您run方法中的代码.
start什么是推出一个新的线程.