线程的不可预测的行为

sHA*_*ILU 1 java multithreading

任何人都可以解释为什么这个程序给出输出9?我猜测"不可预测的行为"作为答案,因为主线程和线程0可以按任何顺序执行.join()会对主线程本身做什么?

public class Starter extends Thread{
    private int x = 2;
    public static void main(String[] args) throws Exception{
        new Starter().makeItSo();
    }

    public Starter(){
        //Thread main
        x=5;
        start();
    }

    public void makeItSo() throws Exception{
        //Thread main
        join();
        x = x-1;
        System.out.println(x);
    }

    public void run(){ 
        //Thread-0
        x*= 2;
        }
}
Run Code Online (Sandbox Code Playgroud)

主线程启动线程0并调用run方法.但如果你把SOP放在makeItSo()中,它会说主线程在调用join()之后在那里等待!为什么?我认为makeItSo()或run()之间没有序列,所以X的值将是不可预测的.

rmh*_*tog 6

此处的执行顺序是固定的,因为调用join():

  1. 构造函数设置x = 5.
  2. 构造函数调用start哪个调用run新的线程.
  3. run执行x *= 5,x等于10.
  4. makeItSo叫做.它呼唤join,因此等待run结束.
  5. 最后,makeItSo集合x = x-1,x等于9.

  • @sHAILU无法保证,但是你可以确定join()在run()之前不会返回. (3认同)