
几天前,一位同事在阿里方面被问到了这样一个多线程问题: 如何确保多个线程的顺序执行. 当时他没有回答,所以为了避免每个人都会遇到相同的面试问题或仍然无法回答,我们今天将分析并回答这个问题.

问题原因
因为线程执行是由CPU时间片处理的,所以当执行多个线程时,如果没有限制,则不能保证线程的执行顺序. 以下源代码:


A B C三个线程同时启动,最终的执行结果不是每次都顺序输出A B C,但是每次运行的结果都不同. 可以输出A B C,也可以输出B A C,这不能保证线程执行的顺序.
加入方式
join方法是使用Thread.join方法实现的. Thread.join意味着当前线程需要先等待previousThread线程终止,然后才能从thread.join返回. 简单地说多线程面试题 阿里,线程将阻塞join方法,直到线程执行完毕.
有两种方法可以实现join方法: 主线程连接和执行线程连接. 让我们依次分析:
1. 主线程连接


上面的源代码是主线程连接的实现. 其原理是确保执行线程完成后再启动后续线程,从而实现多个线程的顺序执行.
2. 执行线程联接

上面的源代码是执行线程连接的实现方法. 原理是通过传入beforeThread(在执行此线程之前需要执行的线程对象)来确保依次执行多个线程.

Thread.join源代码实现:

从Thread.join的源代码中可以知道Thread.join的原理实际上非常简单,也就是说,如果线程尚未完成执行,则它一直在等待旋转训练,并且执行完成后多线程面试题 阿里,轮训结束,并继续执行后续代码.
Executors.newSingleThreadExecutor实现方式
Executors.newSingleThreadExecutor是一个特殊的线程池实现,它是一个单线程线程池,核心线程数和最大线程数为1,等效于串行执行,因此可以用来实现多个线程顺序执行.

注意: 如果您对线程池了解不多,可以阅读作者先前关于线程池的文章:
阿里P8老板总结: Java线程池的详细说明,阅读后您将了解

上面的源代码是Executors.newSingleThreadExecutor的实现. 只要按顺序提交任务,就可以保证执行多个线程任务.
END
作者是一个热爱互联网,互联网技术和共享技术的年轻人. 如果您像我一样,我愿意成为您的朋友,并与您分享每一项宝贵的知识. 喜欢作者,喜欢+转发+的学生!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-225770-1.html
钻进那条缝