当前位置: 首页 > 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.xdnf.cn/news/989965.html

相关文章:

  • *res = append(*res, temp) 为什么要使用 temp 作为临时存储值
  • Hydra 工具小白入门教程指导篇
  • 18.进程间通信(四)
  • Python_day51
  • Future与CompletableFuture:异步编程对比
  • v4l2_subdev 与 /dev/videoX 的关联
  • Git不能更新以及提交代码,提示链接超时,本地凭证无问题
  • 6.11 MySQL面试题 日志 性能 架构
  • 深入理解TCP以及三次握手与四次挥手
  • 面对多个项目并行,协作机制如何建立?
  • Java 8 Stream 流详细教程 - 全面指南
  • 重塑未来的力量:人工智能的技术演进与产业变革
  • git的5种分支分别是干嘛的,git常用指令
  • git的常用方法
  • 交换机上抓包
  • 大模型与人工智能
  • 了解shell中的Fork炸弹
  • Java并发编程实战 Day 17:CompletableFuture高级应用
  • 种子音乐携手RBW 精心打造Solar颂乐首支中文单曲《Floating Free》
  • 单端的时钟阻抗设置为50欧姆,差分的时钟阻抗设置为100欧姆
  • echarts 地图 海南省全岛完整展示
  • Vuex 中Mutation 和Action介绍
  • Android SDK Manager 2025镜像,亲测好用
  • Windows为何总在不停更新补丁
  • EtherCAT转CANopen网关实现与伺服系统连通的配置实例探究
  • linux虚拟机磁盘容量不足?一个指令解决问题
  • 国内各种AI工具库
  • 大模型笔记_检索增强生成(RAG)
  • ABC 337
  • Arduino入门教程:0、课程介绍认识Arduino