zoukankan      html  css  js  c++  java
  • 关于线程执行顺序的问题

       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!

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

     

  • 相关阅读:
    简单组网(根据MAC地址划分VLAN)
    简单组网(根据接口划分VLAN)
    简单组网(LACP)负载分担链路聚合
    简单组网(Eth-Trunk)负载分担链路聚合
    《数字图像处理_第三版_中_冈萨雷斯》第一章笔记
    安全测试类型
    全链路压测
    容量测试与容量规划
    性能测试详细介绍
    树莓派vnc连接,放歌调节声音
  • 原文地址:https://www.cnblogs.com/gosaint/p/9557644.html
Copyright © 2011-2022 走看看