首页 > 解决方案 > thread.join() 的线程完成时间

问题描述

目前在生产应用程序中使用线程。我想知道 - 如果线程都具有相同定义的静态工作负载,它们会按顺序完成和挂起吗?例如,如果我在循环中创建线程 1、线程 2、线程 3 并让它们添加最多 1,000 的值,它们是否总是按照创建的顺序完成?

我使用 join() 方法对该理论进行了一些测试,该理论(表面上)似乎是正确的。

public class ThreadingMain implements Runnable{

    public static int total;

    public static void main(String[] args) throws InterruptedException {

        for(int i = 0; i < 15; i++) {
            Thread t = new Thread(new ThreadingMain(), i+"");
            t.start();
            t.join();
        }


    }

    @Override
    public void run() {

        add();

    }


    private static void add() {

        int i = 100000;

        for(int j = 0; j < i; j++) {
            total += j;
        }
        System.out.println(Thread.currentThread().getName() + " finished");

    }

}

我得到以下输出:

0 finished
1 finished
2 finished
...
12 finished
13 finished
14 finished

正如预期的那样,删除 join() 不再是这种情况。

本质上,具有相同工作负载的线程是否总是按顺序完成?这有什么变数吗?

标签: javamultithreading

解决方案


由于 CPU 具有有限数量的内核和一次可能执行的线程,操作系统需要管理线程何时以及多长时间获得 CPU 执行时间。这是由操作系统的调度程序完成的。

在这里您可以阅读一些相关信息:操作系统中的 CPU 调度

您的操作系统如何管理线程是您无法从代码中有效影响的事情。你不能保证,比如说,线程A会在线程之前完成,B即使A是在之前创建B的。

同样,请记住,您创建的线程并不是操作系统一次管理的唯一线程。还有更多的进程/程序不属于您的代码,但参与了调度。


推荐阅读