当前位置: 首页 > 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方法。

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

相关文章:

  • 训练过程中的 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在节点上加污点
  • 广州微网站开发/小说百度风云榜
  • 网站开发费算无形资产吗/百度推广托管公司
  • html网站首页图片切换/广州seo优化效果
  • 泰安市网站建设公司/适合seo的建站系统
  • 河北建设集团在哪个网站采购/电商运营怎么做如何从零开始
  • 网站功能模块建设/杭州seo整站优化