关于线程执行顺序的问题
R君今天曾问我:假设现在有三个线程T1、T2、T3。那么他希望T1、T2、T3这三个线程按照顺序去执行,该怎么去完成。我本能的反应是这个好办,使用thread.jon()方法完全可以实现。接着他又问,有没有其它的实现方式,这时我在想,线程的优先级呢,为这三个线程设置优先级,但是我随之否定了自己的这个想法,因为线程的优先级只是理论上的优先级,它可以让线程优先级高的可能概率稍微大的先执行,但是具体执行哪一个线程却是由电脑控制的。众所周知,计算机对于线程的执行是抢占式策略,谁能抢到谁先执行,因此这个方案并不能完全控制顺序。
先说我使用join()方法来实现的具体过程吧;关于join()方法,假设A线程去调用B线程的join()方法,那么只有等待B线程完全执行完毕,A线程才可以执行。具体原理是在A线程中调用B线程的Join()方法,相当于A线程调用了B线程的wait()方法,那么只用当B线程执行完毕,A才会执行,这个期间A线程进入阻塞状态。看如下的实现:
这种方式是在启动线程的时候去顺序的控制。使得并行执行的任务串行化的执行。下面的一种实现方式还是使用的join()方法,但是不同的地方在于下述的方法是在线程的内部进行控制的,其本质和第一种相同。
(这篇文章是我从自己的微信公众号上粘贴过来的)
在这里我吐槽下微信公众号这个编辑器真的很糟心。尤其是对于程序猿来说,没有markdown编辑器,文章的排版太不友好。代码我只能贴图片,否则根本不忍直视。
在上述的例子中验证的结果我没有贴出,但是保证了顺序执行。下面的一种方法是我参照网上的博文的实现,线程池的实现。定义一个创建单个线程的线程池,所有的任务会存储在一个阻塞队列中,队列遵从FIFO原则,即先进先出的原则。这样也可以保证执行顺序。
创建一个newSingleThreadExecutor的线程池。虽然保证了实现,但是任务的提交时有顺序的,先提交的是t1,然后t2、t3这种方式。任务的执行存在顺序。
第一次使用公众号记录自己日常的一些技术问题,希望能和大家多多交流。最后我再提一个实现的想法,就是虽然三个线程,但是对比多线程的生产者和消费者模型来看,只多了一个线程,不知道能不能使用这种模型实现,这位如果有好的实现也可以分享下。Best Regards!
最后再推荐下自己的微信公众号