Java线程和进程

举报
holo.yh 发表于 2021/10/30 23:45:43 2021/10/30
【摘要】 1 进程和线程进程:进程是并发执行程序在执行过程中,资源分配和管理的基本单位。进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。线程:线程是进程的一个执行单元,是进程内可调度实体。线程是比进程更小的独立运行的基本单位。线程也被称为轻量级进程。二者的区别:名称进程线程地址空间不同的进程之间的地址空间是独立的同一进程的所有线程共享本进程的地址空间资源拥有进程之间的资源是独立的...
1 进程和线程
进程:
进程是并发执行程序在执行过程中,资源分配和管理的基本单位。
进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。
线程:
线程是进程的一个执行单元,是进程内可调度实体。
线程是比进程更小的独立运行的基本单位。
线程也被称为轻量级进程。
二者的区别:
名称
进程
线程
地址空间
不同的进程之间的地址空间是独立的
同一进程的所有线程共享本进程的地址空间
资源拥有
进程之间的资源是独立的,无法共享
同一进程的所有线程共享本进程的资源
执行过程
每一个进程可以说就是一个可执行的应用程序
线程不能够独立执行,必须依存在应用程序中
2 创建线程的五种方式
2.1 继承Thread类
通过继承Thread并且重写其run()方法,run方法中定义需要执行的任务。
创建后的子类通过调用start()方法即可执行线程方法。
注意:通过继承Thread实现的线程类,多个线程间无法共享线程类的实例变量。需要创建不同Thread对象,自然不共享资源。

2.2 实现 Runnable 接口
需要先定义一个类实现 Runnable 接口并重写该接口的 run() 方法,此run方法是线程执行体。
接着创建Runnable实现类的对象,作为创建Thread对象的参数target,此Thread对象才是真正的线程对象。
利用实现Runnable接口的线程类创建对象,可以实现线程之间的资源共享。

2.3 实现Callable 接口实现带有返回值的线程
Callable接口如同Runnable接口的升级版,其提供的call()方法将作为线程的执行体,同时允许有返回值。
Callable对象不能直接作为Thread对象的target,因为Callable接口是JAVA5新增接口,不是Runnable接口的子接口。
对于这个问题的解决方案,就引入Future接口,此接口可以接受call()的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作为Thread对象的target

2.4 继承TimerTask
Timer 和 TimerTask 可以作为实现线程的另一种方式。
Timer 是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。
TimerTask 是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

2.5 通过线程池启动多线程
通过Executors 的工具类可以创建线程池。
提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行。
降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗。
方便线程并发数的管控,因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成CPU过渡切换。
2.5.1 线程池一:FixThreadPool(int n)固定大小的线程池

2.5.2 线程池二:SingleThreadPoolExecutor 单线程池
单线程串行执行任务,确保任务按提交顺序执行;
当线程异常结束后,会有新的线程代替之前的线程。

2.5.3 线程池三:CachedThreadPool() 缓存线程池
线程池数量不固定,可以达到最大值。
线程可被重复利用和回收。

2.5.4 线程池四:newScheduledThreadPool()
创建一个周期性的线程池,支持定时及周期性执行任务
创建线程时,指定核心线程数,当执行任务较多超过核心线程时,可额外启动新的线程;
当任务恢复后,仅保留核心线程,其它额外线程将被关闭。

2.5.5 线程池五:newWorkStealingPool 新的线程池类 ForkJoinPool 的扩展
JDK1.8新增加
任务窃取线程池,线程有属于自己的队列,更加适用于多核心处理器。

3 Thread类和Runnable接口区别
实现Runnable接口,避免多继承局限;
实现Runnable接口,可以更好的体现资源、数据共享的概念;
Thread类也是Runnable接口的实现类。

4 线程start和run方法的区别
直接调用线程类下的run方法,并不会启动线程,只是作为普通方法来执行;
如果要启动线程来执行,必须要调用 start 方法。

5 线程的优先级
Java线程的优先级范围是1-10,默认优先级是5,10最高;
线程的优先级仍然无法保障线程的执行次序;
优先级高的线程获取CPU资源的概率较大,优先级低的也并非没机会执行;
主线程main的优先级是5。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200