多线程执行顺序及控制顺序
前言
在多线程并发操作中,每一个线程的执行顺序是不确定的,也许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执行完毕
上一篇: 5 个常用的软件质量指标
下一篇: 多线程多任务顺序执行