Java 线程
发布日期:2021-08-15 22:29:27 浏览次数:32 分类:技术文章

本文共 1548 字,大约阅读时间需要 5 分钟。

线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源。它与父进程的其他线程共享该进程的所有资源。

 

线程的特点:

线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。

线程是独立运行的,其不知道进程中是否还有其他线程存在。

线程的执行是抢占式的,也就是说,当前执行的线程随时可能被挂起,以便运行另一个线程。

一个线程可以创建或撤销另一个线程,一个进程中的多个线程可以并发执行

二:线程的创建及使用

java使用Thread类代表线程,所有的线程对象都必须是Thread或者其子类的实例,每个线程的作用是完成一定任务,实际上是就是执行一段程序流(一段顺序执行的代码)

方案一:继承Thread类创建线程类

步骤:1.定义Thread类的子类 并重写该类的Run方法,该run方法的方法体就代表了该线程需要完成的任务

      2.创建Thread类的实例,即创建了线程对象

      3.调用线程的start方法来启动线程

 

结论:使用继承子Thread类的子类来创建线程类时,多个线程无法共享线程类的实例变量(比如上面的i)

方案二:实现Runnable接口

1:定义Runnable接口的实现类,并重写它的Run方法,run方法同样是该线程的执行体!

2:创建Runnable实现类的实例,并将此实例作为Thread的target创建一个Thread对象,该Thread对象才是真正的线程对象!

3:调用start方法启动该线程

 

 

结论:采用Ruunable接口的方式创建多个线程可以共享线程类的实例变量,这是因为在这种方式下,程序创建的Runnable对象只是线程的target,而多个线程可以共享一个target,所以多个线程可以共享一个实例变量

 

通过Runnable实现多线程其实就是将run包装成线程的执行体,但是目前java无法将任意方法包装成线程执行体

方案三:使用callable和future创建线程

 

从Java5开始,Java提供 Callable接口,Callable接口提供了一个call()方法可以作为线程执行体,看起来和Runnable很像,但call()方法更强大——call()方法可以有返回值、call()方法可以抛出异常

 

Java5提供了Future接口来代表Callable接口的call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现类Future接口,也实现了Runnable接口——可以作为Thread的target。

实现步骤:

1:创建Callable接口的实现类,并实现call方法,该call方法会成为线程执行体,且call方法具有返回值,在创建callable接口的实现类!

2:使用FutrueTask类来包装Callable对象,该FutrueTask封装类Callable的call方法的返回值

3:使用FutrueTask对象作为Thread的target创建并启动新线程!

4:使用FutrueTask的get方法获取执行结束后的返回值

结论:采取Runnable、Callable的优势在于——线程类只是实现了Runnable或Callable接口,还可以继承其它类;在这种方法下,多个线程可以共享一个target对象,因此非常适合多个相同线程处理同一份资源的情况,从而将CPU、代码和数据分开,形参清晰的模型,体现了面对对象的编程思想。劣势在于编程复杂度略高。

 

转载于:https://www.cnblogs.com/jingpeipei/p/6260156.html

转载地址:https://blog.csdn.net/weixin_30781107/article/details/97113924 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:了解 JavaScript (5)– 翻转器(rollover)
下一篇:使用hibernate实现树形结构无限级分类

发表评论

最新留言

不错!
[***.144.177.141]2024年03月27日 09时19分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mysql行级锁升级_mysql innodb 行级锁升级 2019-04-21
c 调用mysql密码为空_C语言连MySQL - osc_srnunz15的个人空间 - OSCHINA - 中文开源技术交流社区... 2019-04-21
mysql怎么分组查询所有数据库_Mysql-4 分组查询与子查询 2019-04-21
mysql 多列union_Mysql联合查询UNION和UNION ALL的使用介绍 2019-04-21
mysql导数据出指定数量_mysql导出指定数据或部份数据的方法 2019-04-21
java thread 多线程_java用Thread方式创建多线程 2019-04-21
java 注解与反射_Java注解与反射直接上手 2019-04-21
java按钮退出_java – 如何在此程序中添加退出按钮?怎么样“清楚”? 2019-04-21
python土味情话_Python 将土味情话语录设置为桌面壁纸 2019-04-21
bootstrap加载mysql数据库_bootstrap后台管理系统前后台实现(含数据库) 2019-04-21
幻兽天下修复版java_宠物天下四-幻兽天下 2019-04-21
java ip 范围内打卡_定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内 2019-04-21
与java线程有关的,线程多少和什么有关?大神们表示有话要说! 2019-04-21
php正则表达式 匹配数字,正则表达式之匹配数字范围 2019-04-21
php中带?错误,参考-此错误在PHP中意味着什么? 2019-04-21
php生成链接列表,根据URL链接和抛文本生成链接<a>标签的PHP函数 2019-04-21
matlab里inline定义矩阵,Matlab中的inline函数_matlab中inline函数 2019-04-21
php html标签自定义属性,浅谈JS读取DOM对象(标签)的自定义属性 2019-04-21
如何使用matlab的siso,利用Matlab内建程式SISODesignTool完成系统分析(Matlab61)开启.PDF... 2019-04-21
php 实现 model层,Thinkhphp5控制器调用的Model层的方法总结 2019-04-21