多线程不按预期工作

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.为什么这种可序列化行为就是这里的情况?

Tim*_*Tim 6

你需要调用t1.start()t2.start()而不是run.

调用run只会执行您run方法中的代码.
start什么是推出一个新的线程.

  • 没问题.我只是这么快就注意到了,因为我过去曾多次犯同样的错误.我认为线程的API在这方面设计有点差 - 很容易犯这个错误. (3认同)