.start()方法之后的线程执行

时间:2019-10-02 03:41:06

标签: java multithreading concurrency java-threads

我想知道在以下情况下会发生什么:

创建了两个线程:

Thread t1 = new Thread();
Thread t2 = new Thread();

假设这些只是打印出一个字符串,然后线程调用.start()方法:

t1.start();
t2.start():

我的问题是,为什么这些线程每次都以看似随机的顺序打印?我知道线程可以同时执行,但是由于主进程的顺序执行,t1不会总是在t2之前完成吗?

3 个答案:

答案 0 :(得分:3)

Thread上调用start()不一定会导致线程随后立即运行。在调用start()与实际运行的线程run()方法的第一行之间可能会发生其他事情。即使您的run()实际上正在运行,您的run()方法完成之前,之中或之后也可能发生其他事情。

在您的问题中,您说:“假设这些只是打印出一个字符串” –这是run()的实现,它是这样做的:

public void run() {
    System.out.println("my name is: " + getName());
}

因此,t1 开始可能首先运行,但是在实际调用System.out.println之前,允许t2执行并运行到完成,然后t1恢复。

如果这种行为不适用于您的用例,则需要添加某种并发保护来协调线程运行的方式和时间。

更新:

为说明不可预测的线程执行顺序,请运行几次此代码并观察输出:

public class Example {
    public static void main(String[] args) {
        for (int k = 0; k < 10; k++) {
            new TestThread(k).start();
        }
    }
}

class TestThread extends Thread {
    private final int k;

    TestThread(int k) {
        this.k = k;
    }

    @Override
    public void run() {
        System.out.print(k + " ");
    }
}

这是我本地运行之一的输出:

7 0 1 5 4 6 3 2 8 9 

答案 1 :(得分:2)

Thread.start()不保证执行。它只会使线程状态可运行并移交给线程调度程序。线程调度程序决定何时运行哪个线程。

答案 2 :(得分:0)

如果需要在多个线程上以定义的顺序执行代码,则需要在这些线程之间添加同步代码。

否则,系统可以按其认为合适的任何顺序安排执行时间。