iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >在Java中实现让线程按照自己指定的顺序执行
  • 733
分享到

在Java中实现让线程按照自己指定的顺序执行

2024-04-02 19:04:59 733人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录如何让线程按照自己指定的顺序执行认识Join利用Executors线程池线程的优先级及执行顺序优先级概述使用优先级如何让线程按照自己指定的顺序执行 我们在日常的多线程开发中,可能

如何让线程按照自己指定的顺序执行

我们在日常的多线程开发中,可能有时会想让每个线程都按照我们指定的顺序来运行,而不是让CPU随机调度,这样可能会让我们在日常的开发工作中带来不必要的麻烦。

既然有了这个需求,也就引入了本文的标题,让线程按照自己指定的顺序来运行。

有兴趣的同学可以猜想下列代码可能运行的结果:

按照正常的理解思路,上面代码的执行顺序依次应该为:t1 → t2 → t3,而实际效果则不是理想的状态。

下图为运行效果:

认识Join

join可能对于一些同学来说并不陌生,此处我就不详细介绍Join是什么了,有疑问的同学可以自行baidu和Google。

这里我将直接介绍如何使用join来达到我们希望看到的效果!

这里主要是利用Join的阻塞效果,来达到我们的使用目的。看上图的运行结果可以得知,程序已经按照我们指定的顺序执行结束了,并得到了我们想要的结果。

其实这里可以深入的思考一下,为什么join可以达到我们想要的效果呢?接下来我们来看下源码

进入join源码后,首先看到的是一个传入0参数的join方法,此处选择继续进入。

首先可以看到join方法是线程安全的,其次可以结合上图一起看,当传入参数为0时,会命中一个wait(0)的方法,有经验的同学应该能直接看懂,这里表示等待。

但是需要说明的是,这里的等待绝对不是等待调用者,而是阻塞的主线程,t1,t2,t3只是子线程,当子线程运行完毕后,主线程结束等待。

这里演示了join的工作方式,也证实了join能让我们在程序中达到自己想要的效果。

除了join能在程序中帮助我们控制线程的顺序外,还有另外的方式,比如我们利用线程池实现试一试。

利用Executors线程池

Executors是jdk中java.util.concurrent包下线程池操作类,可以方便的为我们提供线程池的操作。

这里我们使用Executors中的newSingleThreadExecutor()方法,创建一个单线程的线程池。

根据上图可以得知,利用newSingleThreadExecutor()方法依然能够达到我们期待的效果,其实原理很简单,方法内部是一个基于FIFO的队列,也就是说,当我们依次将t1,t2,t3加入队列中时,实际在就绪状态的只有t1这个线程,t2,t3则会被添加到队列中,当t1执行完毕后,则会继续执行队列中的其他线程。

根据上面的篇幅我们得知了如何让线程按照指定的方式运行,其实方法还有很多,就不一一列举了。

线程的优先级及执行顺序

学习运算符时,读者知道各个运算符之间有优先级,了解运算符的优先级对程序幵发有很好的作用。线程也是如此,每个线程都具有优先级,Java 虚拟机根据线程的优先级决定线程的执行顺序,这样使多线程合理共享 CPU 资源而不会产生冲突。

优先级概述

在 Java 语言中,线程的优先级范围是 1~10,值必须在 1~10,否则会出现异常;优先级的默认值为 5。优先级较高的线程会被优先执行,当执行完毕,才会轮到优先级较低的线程执行。如果优先级相同,那么就采用轮流执行的方式。

可以使用 Thread 类中的 setPriority() 方法来设置线程的优先级。语法如下:

public final void setPriority(int newPriority);

如果要获取当前线程的优先级,可以直接调用 getPriority() 方法。语法如下:

public final int getPriority();

使用优先级

简单了解过优先级之后,下面通过一个简单的例子来演示如何使用优先级。

例 1

分别使用 Thread 类和 Runnable 接口创建线程,并为它们指定优先级。

public class FirstThreadInput extends Thread
{
    public void run()
    {
        System.out.println("调用FirstThreadInput类的run()重写方法");    //输出字符串
        for(int i=0;i<5;i++)
        {
            System.out.println("FirstThreadInput线程中i="+i);    //输出信息
            try
            {
                Thread.sleep((int) Math.random()*100);    //线程休眠
            }
            catch(Exception e){}
        }
    }
}

(2) 创建实现 Runnable 接口的 SecondThreadInput 类,实现 run() 方法。代码如下:

public class SecondThreadInput implements Runnable
{
    public void run()
    {
        System.out.println("调用SecondThreadInput类的run()重写方法");    //输出字符串
        for(int i=0;i<5;i++)
        {
            System.out.println("SecondThreadInput线程中i="+i);    //输出信息
            try
            {
                Thread.sleep((int) Math.random()*100);    //线程休眠
            }
            catch(Exception e){}
        }
    }
}

(3) 创建 TestThreadInput 测试类,分别使用 Thread 类的子类和 Runnable 接口的对象创建线程,然后调用 setPriority() 方法将这两个线程的优先级设置为 4,最后启动线程。代码如下:

public class TestThreadInput
{
    public static void main(String[] args)
    {
        FirstThreadInput fti=new FirstThreadInput();
        Thread sti=new Thread(new SecondThreadInput());
        fti.setPriority(4);
        sti.setPriority(4);
        fti.start();
        sti.start();
    }
}

(4) 运行上述代码,运行结果如下所示。

调用FirstThreadInput类的run()重写方法
调用SecondThreadInput类的run()重写方法
FirstThreadInput线程中i=0
SecondThreadInput线程中i=0
FirstThreadInput线程中i=1
FirstThreadInput线程中i=2
SecondThreadInput线程中i=1
FirstThreadInput线程中i=3
SecondThreadInput线程中i=2
FirstThreadInput线程中i=4
SecondThreadInput线程中i=3
SecondThreadInput线程中i=4

由于该例子将两个线程的优先级都设置为 4,因此它们交互占用 CPU ,宏观上处于并行运行状态。

重新更改 ThreadInput 类的代码、设置优先级。代码如下:

fti.setPriority(1);
sti.setPriority(10);

重新运行上述代码,如下所示。

调用FirstThreadInput类的run()重写方法
调用SecondThreadInput类的run()重写方法
FirstThreadInput线程中i=0
SecondThreadInput线程中i=0
SecondThreadInput线程中i=1
SecondThreadInput线程中i=2
SecondThreadInput线程中i=3
SecondThreadInput线程中i=4
FirstThreadInput线程中i=1
FirstThreadInput线程中i=2
FirstThreadInput线程中i=3
FirstThreadInput线程中i=4

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 在Java中实现让线程按照自己指定的顺序执行

本文链接: https://www.lsjlt.com/news/153107.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在Java中实现让线程按照自己指定的顺序执行
    目录如何让线程按照自己指定的顺序执行认识Join利用Executors线程池线程的优先级及执行顺序优先级概述使用优先级如何让线程按照自己指定的顺序执行 我们在日常的多线程开发中,可能...
    99+
    2024-04-02
  • Java中怎么实现让线程按照自己指定的顺序执行
    这篇“Java中怎么实现让线程按照自己指定的顺序执行”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么实现让线程按...
    99+
    2023-07-02
  • Java怎么让多线程按顺序执行
    本文小编为大家详细介绍“Java怎么让多线程按顺序执行”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么让多线程按顺序执行”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在子线程中通过join()方法指定...
    99+
    2023-06-30
  • Java让多线程按顺序执行的几种方法
    目录在子线程中通过join()方法指定顺序在主线程中通过join()方法指定顺序通过倒数计时器CountDownLatch实现通过创建单一化线程池newSingleThreadExe...
    99+
    2024-04-02
  • mysql按照自定义(指定顺序)排序的方法实例
    目录一、mysql中实现指定排序需求二、解决方案1:自定义排序实现01. case when 转换实现自定义排序;02:mysql排序函数filed 实现自定义排序(推荐);03:函...
    99+
    2024-04-02
  • java如何实现多线程的顺序执行
    场景 编写一个程序,启动三个线程,三个线程的name分别是A,B,C;,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC... 使用 synchronized 实现 ...
    99+
    2024-04-02
  • java怎么实现多线程的顺序执行
    这篇文章主要介绍java怎么实现多线程的顺序执行,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!场景编写一个程序,启动三个线程,三个线程的name分别是A,B,C;,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是A...
    99+
    2023-06-15
  • 微信小程序中如实现按顺序同步执行
    这篇文章给大家分享的是有关微信小程序中如实现按顺序同步执行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。小程序按顺序同步执行有如下两种方式:第一种方式:回调函数执行,后一个方法写到前一个的回调函数中从而实现顺序执...
    99+
    2023-06-14
  • Java实现线程按序交替执行的方法详解
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目:有a、b、c三个线程,使得它们按照abc依次执行10次。 二、解题思路 控制执行线程变量flag,利用lock锁来保证线程...
    99+
    2024-04-02
  • Java中保证线程顺序执行的操作代码
    只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的。如果只是创建三个线程然后执行,最后的执行顺序是不可预期的。这是因为在创建完线程之后,线程执行的开始时间取决于CPU何...
    99+
    2024-04-02
  • Java 实现使用Comparable按照我们指定的规则排序
    练习: 存储学生对象并遍历,创建TreeSet集合使用无参构造方法,并按照年龄从小到大的顺序排序,若年龄相同再按照姓名的字母顺序排序 分析: 1.创建学生类,成员变量name,age...
    99+
    2024-04-02
  • 三个线程顺序执行的实现方法是什么
    本篇内容主要讲解“三个线程顺序执行的实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“三个线程顺序执行的实现方法是什么”吧!先说下要求,就是三个线程,...
    99+
    2024-04-02
  • 【shell】定期自动执行程序的shell实现
    【shell】定期自动执行程序的shell实现 1 chmod1.1 权限符号1.2 permission1.3 八进制语法1.4 操作者的身份介绍:所有者、用户组和其他人1.4.1 文件所有...
    99+
    2023-10-22
    linux 服务器 unix
  • 你知道如何在Java打包中实现同步函数的顺序执行吗?
    当我们在Java中编写多线程程序时,经常会遇到需要同步执行一些函数的情况。而在Java中,我们可以使用synchronized关键字来实现同步执行。但是,当我们需要按照一定的顺序来执行同步函数时,就需要一些特殊的技巧。本文将介绍如何在Jav...
    99+
    2023-09-29
    打包 同步 函数
  • for循环内线程池并发执行任务,等到子线程全部处理完任务,主线程在执行java的实现方式
    for循环内线程池并发执行任务,等到子线程全部处理完任务,主线程在执行 方式一 使用 CountDownLatch 在 Java 中,您可以使用 CountDownLatch 来实现主线程等待子线程执行完成的功能。CountDownLatc...
    99+
    2023-08-23
    多线程 线程池 线程调用顺序
  • Win7系统中限制指定程序运行的实现方法
    如果不想让办公室的同事在你电脑上运行QQ或是阿里旺旺等程序,但如果不让同事安装的话,也会伤了和气,那怎么办呢我们完全可以通过Windows 7系统来限制指定的程序运行,通过使用Windows 7系统新增的AppLocke...
    99+
    2023-06-02
    限制 程序运行 Win7 实现 系统 方法
  • 如何在Java应用程序中实现索引的自动更新?
    在Java应用程序中,索引的自动更新是一个非常重要的功能,尤其是在需要频繁更新索引的情况下。本文将介绍如何在Java应用程序中实现索引的自动更新,以提高应用程序的性能和可靠性。 一、索引的自动更新概述 在Java应用程序中,索引的自动更新是...
    99+
    2023-08-22
    path 打包 索引
  • 如何在Java程序中实现异步编程和重定向同时进行资源加载?
    Java是一种广泛使用的编程语言,它提供了许多工具和库,以帮助开发人员更快地编写高质量的应用程序。在Java应用程序中,异步编程和重定向同时进行资源加载是两个常见的需求。本文将介绍如何在Java程序中实现这两个需求。 一、什么是异步编程? ...
    99+
    2023-11-07
    重定向 异步编程 load
  • PHP 开发者必知:如何在 Laravel 应用程序中实现 Shell 脚本的执行?
    在 Laravel 应用程序中执行 Shell 脚本是一个经常需要解决的问题。特别是在一些需要在后台执行一些任务的场景中,Shell 脚本能够大大提高我们的工作效率。本文将介绍如何在 Laravel 应用程序中实现 Shell 脚本的执行...
    99+
    2023-07-02
    laravel shell http
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作