关于线程执行顺序的问题

Posted gosaint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于线程执行顺序的问题相关的知识,希望对你有一定的参考价值。

   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!

 

  最后再推荐下自己的微信公众号

 

 技术分享图片

 

以上是关于关于线程执行顺序的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于CountDownLatch控制线程的执行顺序

关于线程的执行顺序,可能真的只是你以为的你以为

关于面试中异步与延时 执行顺序的预期结果问题

关于代码的执行顺序

关于多线程提高程序执行速率的问题

Vb.net 多个线程执行顺序的问题