三个线程T1,T2,T3.保证顺序执行的三种方法

2023-10-27

第一种方式:顺序在线程中创建实例(最容易想到的办法)。

public class TestTwo {
        static TestTwo t=new TestTwo();
        class T1 extends Thread{
            @Override
            public void run() {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //T1线程中要处理的东西
                System.out.println("T1线程执行")
            }
        }

        class T2 extends Thread{
            @Override
            public void run() {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //T2线程中要处理的东西
                System.out.println("T2线程执行");
                t.new T1().start();
            }
        }

        class T3 extends Thread{
            @Override
            public void run() {
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //T3线程中要处理的东西
                System.out.println("T3线程执行");
                t.new T2().start();
            }
        }
        
        public static void main(String[] args) {
            t.new T3().start();
       //打印结果如下:
             //T3线程执行
        //T2线程执行
              //T1线程执行
        }
}

第二种方式:

  • 看到有人说运用单个线程池(SingleThreadExecutor)来实现,确切的说这里不太符合,从打印结果看出,其实我们是在一个线程里,执行了三个任务。
Thread t1 = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " run 1");
                }
            }, "T1");
             Thread t2 = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " run 2");
                }
            }, "T2");
             Thread t3 = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " run 3");
                }
            }, "T3");

            //三个线程顺序执行 第一种方案,单个线程池 顺序放入执行队列中
            ExecutorService executor = Executors.newSingleThreadExecutor();

            executor.submit(t3);
            executor.submit(t2);
            executor.submit(t1);
            executor.shutdown();
            //输出结果如下:
//            pool-1-thread-1 run 3
//            pool-1-thread-1 run 2
//            pool-1-thread-1 run 1

第三种:运用线程的 join 方法来实现

public class JoinTest2 {
	// 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
	public static void main(String[] args) {
		final Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("t1");
			}
		});
	final Thread t2 = new Thread(new Runnable() {
	@Override
	public void run() {
		try {
			// 引用t1线程,等待t1线程执行完
			t1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
			System.out.println("t2");
		}
	});
	Thread t3 = new Thread(new Runnable() {
	@Override
	public void run() {
		try {
			// 引用t2线程,等待t2线程执行完
			t2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
			System.out.println("t3");
		}
	});
	t3.start();//这里三个线程的启动顺序可以任意,大家可以试下!
	t2.start();
	t1.start();
	}
}

详细链接http://t.zoukankan.com/liran123-p-9313830.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三个线程T1,T2,T3.保证顺序执行的三种方法 的相关文章

  • Android Toast 消息不起作用

    我正在通过 Andengine 为 Android 开发游戏 我有 MainActivity 类和 GameScene 类 我在 GameActivity 中使用 Toast 消息 它正在发挥作用 Toast makeText this H
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma
  • Android ClassNotFoundException:在路径上找不到类

    10 22 15 29 40 897 E AndroidRuntime 2561 FATAL EXCEPTION main 10 22 15 29 40 897 E AndroidRuntime 2561 java lang Runtime

随机推荐

  • unity面板的旋转次序和万向锁

    每个unity物体在面板上都有一个rotation值 那么这个旋转的数值是怎么得出来的呢 假如一个物体xyz的rotation值都不为零 我们拉动面板上的数值会有这样的发现 拉动y值时物体绕世界坐标的y轴也就是竖直方向做旋转 拉动z轴物体沿
  • php websocket 示例

    php使用websocket示例详解 一 php 中处理 websocket WebSocket 连接是由客户端主动发起的 所以一切要从客户端出发 第一步是要解析拿到客户端发过来的 Sec WebSocket Key 字符串 复制代码代码如
  • 2、centos7修改最大文件数

    1 file max 系统所有进程能够打开的文件数 查看当前值 cat proc sys fs file max 修改值 file max的值要大于nr open 如果不修改nr open 那么file max至少要大于1024 1024
  • springboot启动报错:Unable to start web server; nested exception is org.springframework................

    Spring Boot启动出现错误 错误内容大概的意思是 未能加载嵌入的供web应用加载的空间 是因为缺少ServletWebServerFactory bean 解决方法 添加注释 EnableAutoConfiguration
  • inline-block布局与float布局

    1 解释一下display的几个常用的属性值 inline block inline block inline 行内元素 使元素变成行内元素 拥有行内元素的特性 即可以与其他行内元素共享一行 不会独占一行 不能更改元素的height wid
  • 掌握 Linux 调试技术

    http www ibm com developerworks cn linux sdk l debug index html ibm pcon 在 Linux 上找出并解决程序错误的主要方法 Steve Best sbest us ibm
  • 使用tkinter编写一个非常简单的获取股价程序(数据源tushare)

    使用tkinter编写一个非常简单的获取股价程序 数据源tushare 先看结果 主界面 获取股票信息 为更新信息按钮 查询股票信息 为功能按钮 查询股票信息界面 点击查询后 输入起始终止时间 可以查看对应的价格 并绘制K线图 价格 K线图
  • mysql5.7免安装版本

    安装环境 Win10 64位 软件版本 MySQL 5 7 16 解压版 一 下载 点开下面的链接 链接 下载地址 B站安装视频地址 链接 安装视频地址 选择选择和自己系统位数相对应的版本点击右边的Download 此时会进到另一个页面 同
  • 怎么制作睡袋rust_【手工课堂第二十三期】宝宝睡袋DIY

    作者 宝宝知道 依米Yimi 大家好 又到我的手工课堂咯 我是依米 热爱手工 有时间必手工 这一期给大家带来宝宝睡觉必备神器 仿踢睡袋 宝宝睡觉前 穿着睡袋来个bedtime story 睡前故事 真是极好的 睡袋是很多宝妈会选择的睡眠小物
  • 使用hiredis 实现异步设置发布订阅模式

    通过libevent实现订阅的回调事件 发布端代码如下 include
  • Unity3d 引擎原理详细介绍、Unity3D引擎架构设计

    体系结构 为了更好地理解游戏的软件架构和对象模型 它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的 它的主要原则 Unity3D 引擎 Unity3D的是一个屡获殊荣的工具 用于创建交互式3D应用程序在多个platfor
  • vscode 中如何删除空行

    在 Visual Studio Code 中 可以使用以下步骤来删除空行 打开你想要删除空行的文件 按下 Ctrl F 打开查找功能 在查找框中输入 s 点击 查找全部 按钮 这样就可以找到文件中的所有空行 选中所有空行 然后按下 Dele
  • SIM卡物理形态与引脚定义

    SIM Subscriber Identity Moudle 用户身份模块 大家并不陌生 有了它才可以进行通话服务 本篇文章介绍下SIM的基础知识与接口形态 物理规格 SIM物理规格随着设备小型化发展也是一直在减小 如下图所示 SIM卡 引
  • R语言---颜色选择和设置

    R语言颜色选择和设置 1 R base颜色版 1 1 R base颜色 1 2 R ggplot 默认颜色反转 2 R颜色包RColorBrewer 3 R颜色包wesanderson viridis ggsci 3 1 wesanders
  • spring boot (十三)整合Activiti工作流(四)集成Diagram Viewer跟踪流程

    前言 activiti 5 22 0 一 引入依赖 如果需要用到Diagram Viewer跟踪流 那么需要引入下面的依赖
  • 怎样安装VLC到CentOS7

    第一步 安装Epel Release 及Nux Repository 打开终端 输入命令 1 yum y install epel release 2 rpm Uvh http li nux ro download nux dextop e
  • 数据挖掘实例

    1 Numpy基础 1 创建数组 创建一维数组 import numpy as np a np arange 5 注 将0 1 2 3 4赋值给a这个变量 创建m n的多维数组 import numpy as np def cnmda m
  • Vue本地跨域和线上跨域如何解决?

    本地跨域是通过在vue config js 件 的devServer属性 的proxy属性配置 共配置三个属性 分别是 代理名称 代理地址 开启跨域 重写路径 可有可无 线上跨域是在nginx conf 件 配置 代理名称是通过locati
  • 解决Intel12代酷睿CPU【小核载满,大核围观】的问题(WIN11)

    文章目录 一 起因和问题 1 1 升级12代酷睿 1 2 程序运行速度堪忧 二 理论成绩旌旗招展 2 1 CPU Z 2 1 1 8P0E 2 1 2 8P8E 2 2 鲁大娘 2 2 1 8P0E 2 2 2 8P8E 2 3 其它测试软
  • 三个线程T1,T2,T3.保证顺序执行的三种方法

    第一种方式 顺序在线程中创建实例 最容易想到的办法 public class TestTwo static TestTwo t new TestTwo class T1 extends Thread Override public void