欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程执行顺序及控制顺序

程序员文章站 2022-05-05 21:37:08
...

前言

在多线程并发操作中,每一个线程的执行顺序是不确定的,也许one线程是最先创建并且执行start()方法的,但是却不一定是第一个执行完毕的线程,那么今天就和大家一起来看一下我们该怎么控制线程的执行顺序

代码演示

如果想实现one线程在two线程后执行完毕应该怎么做呢?

1.我们先创建两个线程的类
2.实例化one后,执行run()时创建线程two的对象,调用join方法
3.观察线程的执行效果

one线程

package Thread.Model;

public class ThreadOne extends Thread{
    public void run(){
        System.out.println("one start");
        //在one线程中创建two线程
        ThreadTwo two = new ThreadTwo();
        two.start();
        try {
        	//使two加入到one线程中
        	//这里的意思就是 当two调用了join方法之后
        	//one线程必须要等two执行完毕  才会开始执行
            two.join();
            //join方法在后边会有详细的介绍
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("one stop");
    }
}

two线程

package Thread.Model;

public class ThreadTwo extends Thread{
    public void run(){
        System.out.println("two start");
        System.out.println("two stop");
    }
}

执行结果
多线程执行顺序及控制顺序

通过代码的演示我们可以看到,two线程确实是在one之前执行完毕了,这里我们使用到了一个方法,join(),我们来看一下join()方法底部到底是什么样子的
多线程执行顺序及控制顺序
接下来是带有参数的join()方法
多线程执行顺序及控制顺序
可以看到join()方法不传参数就是让主线程等待到调用join()方法的线程执行完毕再进行执行,参入参数就是让主线程只等待固定的时间,时间一到,主线程就不管其他线程了,开始自己的执行

那么,问题又来了,如果two调用json()方法并传入2000毫秒,在two的执行过程中,one的等待过程中,two被锁定了5000毫秒,那么one是继续等待5000毫秒才执行还是会在2000之后就执行呢?我们来试一试

创建一个three线程

three线程需要做的事情,就是获取到two线程然后将其锁定

package Thread.Model;

public class ThreadThree extends Thread{
    private ThreadTwo two;
    public ThreadThree(ThreadTwo two){
        this.two = two;
    }

    public void run(){
        System.out.println("three start");
        //锁定two线程
        synchronized (two){
            System.out.println("two is locked");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("two is free");
        }
        System.out.println("three stop");
    }

}

three既然是要锁定two线程,那么肯定是在two创建后,所以我们直接在two的run()方法中创建three对象并将two作为参数传递进去

看一下结果
多线程执行顺序及控制顺序
从运行结果来看,很明显one是等待了two 5000毫秒之后才执行完毕
two虽然是被锁定的状态,但是还是在执行的,当two的锁定解除之后three随之执行完毕,最后one执行完毕