当前位置: 首页 > news >正文

创建和运行线程

注意:我们运行Java代码时,本身就有一个线程,就是所谓的“主线程”。我们下面是在此基础上,创建其他额外的线程。

目录

一.创建线程的两种基本方式

1.方式一:new Thread实例

2.方式二:使用Runnable接口配合Thread类

二.lambda简化

1.创建Runnable接口时,可以使用lambda简化

2.也可以直接将lambda简化的Runnable接口,直接放到Thread类的构造函数中,从而创建出一个线程

三.分析创建线程时,方式一和方式二的区别

四.创建线程的方式三:FutureTask任务

五.结语


一.创建线程的两种基本方式

1.方式一:new Thread实例

@Slf4j(topic = "c.Test1")
public class Test01 {public static void main(String[] args) {//1.1 创建线程Thread t = new Thread() {@Overridepublic void run() {log.debug("running");}};//1.2 给线程命名t.setName("t1");//1.3 运行线程t.start();//2 主线程输出log.debug("running");}
}

运行结果:

2.方式二:使用Runnable接口配合Thread类

@Slf4j(topic = "c.Test2")
public class Test02 {public static void main(String[] args) {//1.1 创建Runnable接口Runnable runnable = new Runnable(){@Overridepublic void run() {log.debug("running");}};//1.2 new Thread实例Thread t = new Thread(runnable);//1.3 给线程起名t.setName("t1");//上面两步,可以写成Thread t = new Thread(runnable, "t1");//1.4 启动线程t.start();//2 主线程输出log.debug("running");}
}

运行结果:

二.lambda简化

1.创建Runnable接口时,可以使用lambda简化

如下图所示,这个lambda在外观上有点像前端的箭头函数。

2.也可以直接将lambda简化的Runnable接口,直接放到Thread类的构造函数中,从而创建出一个线程

运行结果:

以后我们就可以采用这种间接的方式,快速创建一个线程出来。

三.分析创建线程时,方式一和方式二的区别

①直接new Thread实例,是直接赋值Thread实例的run方法。

②而让Thread实例继承一个Runnable接口,再在该接口中定义run方法,是间接赋值Thread类的run方法。

总之,无论是方式一还是方式二,本质都是修改Thread实例的run方法而已,只不过一个是直接修改,一个是间接修改而已。

  • 方式一是把线程和任务(run方法)合并在了一起,方式二是把线程和任务分开了。
  • 使用Runnable更容易与线程池等高级API配合。
  • 使用Runnable让任务类脱离了Thread继承体系,更加灵活。

四.创建线程的方式三:FutureTask任务

@Slf4j(topic = "c.Test5")
public class Test05 {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建任务FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {log.debug("running");Thread.sleep(2000);return 100;}});//创建线程,让线程执行任务Thread t1 = new Thread(task, "t1");//启动线程t1.start();//在主线程,获取任务的返回值“100”log.debug("{}", task.get());//task.get()会阻塞主线程,直到获取到任务的返回值(任务执行完毕)即可}
}

运行结果:

五.结语

以上讲了三种创建线程的方式,其实就是讲了三种定义run方法的方式,告诉线程要执行什么任务而已。

三种方式分别是在Thread中直接赋值run方法、通过Runnable接口间接赋值run方法、通过FutureTask间接定义run方法。

喜欢本篇文章的话,可以留个免费的关注呦~~

http://www.dtcms.com/a/243924.html

相关文章:

  • 训练过程中的 Loss ?
  • 红队手法:从web漏洞到ssh横向移动 实战方案
  • 达梦数据库dsc集群+异步主备
  • Android11三网共存
  • el-table-v2修改表头、单元格、表格整体的宽度、高度样式
  • 用 IRify 深入探索 WebShell 中的 Source/Sink 挖掘
  • C# ConcurrentDictionary 中获取指定范围的元素
  • 解密Spring Boot:深入理解条件装配与条件注解
  • 教师端用户操作手册
  • 使用 C/C++、OpenCV 和 Libevent 构建联网人脸识别考勤系统 [特殊字符]‍[特殊字符]
  • docker和docker-compose的版本对应关系怎么看?
  • 顶顶通电话机器人功能列表
  • Spring Security是如何完成身份认证的?
  • 紫光展锐T8300以创新音频技术重塑感知世界
  • kafka-生产者(day-2)
  • python打卡第49天
  • 康谋方案 | 高精LiDAR+神经渲染3DGS的完美融合实践
  • 提升电子商务平台安全的有效策略
  • SSD,emmc 的写放大
  • k8s在节点上加污点
  • argocd部署cli工具并添加k8s集群
  • 数据安全进阶:30页数据安全管理培训精读【附全文阅读】
  • 跨域的本质与实战:从理论到松鼠短视频系统的演进-优雅草卓伊凡|卢健bigniu
  • window 显示驱动开发-如何查询视频处理功能(六)
  • 【Bluedroid】蓝牙启动之 RFCOMM_Init 流程源码解析
  • Android 默认第三方app运行权限(android11-13)
  • 【测试专栏】自动化测试——云存储项目
  • 计算机视觉与深度学习 | 基于Matlab的低照度图像增强算法原理,公式及实现
  • matlab红外与可见光图像配准算法
  • 学车笔记 变挡