Java线程连接创建线程的顺序运行

时间:2017-08-17 14:01:23

标签: java multithreading concurrency

当我运行以下代码时,程序永远不会退出并陷入while循环,这应该是预期的行为。

public class MyClass implements Runnable {
    public static final int NO_OF_THREADS = 100;
    private static int count;
    private static Set<Integer> set = new HashSet<>();
    @Override
    public void run() {
        for(int i=0 ;i<10000; i++) {
            set.add(count++);
        }
    }
    public static void main(String[] args) throws Exception {
        Thread[] threadArray = new Thread[NO_OF_THREADS];
        for(int i=0; i<NO_OF_THREADS; i++) {
            threadArray[i] = new Thread(new MyClass());
        }
        for(int i=0; i<NO_OF_THREADS; i++) {
            threadArray[i].start();
            //threadArray[i].join();
        }
        while(set.size()!=1000000) {}
    }
}

取消注释join()后,程序将始终退出。此外,当我修改代码以打印线程运行的序列时,在连接到位的情况下,我观​​察到Thread-0首先完成其任务,然后是Thread-1,依此类推正确的编号顺序。

  

这是预期的行为还是JVM的特性之一   调度器?

1 个答案:

答案 0 :(得分:1)

是的,这是预期的行为,你的连接被评论,超过线程将同时访问你的设置,你将有竞争条件,在一个情况下,计数将是相同的超过线程所以基本上你将在同一个地方添加多个元素,这样你就不会在集合中拥有预期的项目数量,因此循环条件将始终为真,您的应用程序将不会退出。

如果没有注释你的连接,主线程将被阻塞,直到每个线程完成,当第一个线程启动并且主线程移动到连接时,主线程将被阻塞并等待第一个线程完成,然后移动到循环的下一次迭代,所以你不会同时访问&#34; count&#34;因此所有添加的元素都是不同的