Java线程进程

网友投稿 532 2022-05-29

1 进程和线程

进程:

进程是并发执行程序在执行过程中,资源分配和管理的基本单位。

进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。

线程:

线程是进程的一个执行单元,是进程内可调度实体。

线程是比进程更小的独立运行的基本单位。

线程也被称为轻量级进程。

二者的区别:

名称

进程

线程

地址空间

不同的进程之间的地址空间是独立的

同一进程的所有线程共享本进程的地址空间

资源拥有

进程之间的资源是独立的,无法共享

同一进程的所有线程共享本进程的资源

执行过程

每一个进程可以说就是一个可执行的应用程序

线程不能够独立执行,必须依存在应用程序中

2 创建线程的五种方式

Java线程和进程

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。

Java 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Go语言实战》笔记(十四) | Go 通道
下一篇:3条“锦囊”妙计破解企业出海难题
相关文章