多线程面试必备知识点(一)

  1. 什么是进程、线程
    进程是正在运行的程序的实例。
    进程是线程的容器,即一个进程中可以开启多个线程。
    比如打开一个浏览器、打开一个word等操作,都会创建进程。

线程是进程内部的一个独立执行单元;
一个进程可以同时并发运行多个线程;
比如进程可以理解为医院,线程是挂号、就诊、缴费、拿药等业务活动

  1. 什么是并发与并行
    要想学习多线程,必须先理解什么是并发与并行

并行:指两个或多个事件在同一时刻发生(同时发生)。

并发:指两个或多个事件在同一个时间段内发生。

  1. 线程创建
    Java中线程有四种创建方式:

继承Thread类
实现Runnable接口
实现Callable接口
线程池
3.1. 继承Thread类
3.1.1. 第一步:创建自定义线程类

3.1.2. 第二步:创建测试类

执行效果如下:

3.2. 实现Runnable接口
3.2.1. 第一步:创建自定义类实现Runnable接口

3.2.2. 第二步:创建测试类

执行效果如下:

3.3. 实现Callable接口
3.3.1. 第一步:创建自定义类实现Callable接口

3.3.2. 第二步:创建测试类

运行效果图如下:

3.4. 线程池-Executor
3.4.1. 线程池线类关系图

Executor接口:声明了execute(Runnable runnable)方法,执行任务代码
ExecutorService接口:继承Executor接口,声明方法:submit、invokeAll、invokeAn9y以及shutDown等
AbstractExecutorService抽象类:实现ExecutorService接口,基本实现ExecutorService中声明的所有方法
ScheduledExecutorService接口:继承ExecutorService接口,声明定时执行任务方法
ThreadPoolExecutor类:继承类AbstractExecutorService,实现execute、submit、shutdown、shutdownNow方法
ScheduledThreadPoolExecutor类:继承ThreadPoolExecutor类,实现ScheduledExecutorService接口并实现其中的方法
Executors类:提供快速创建线程池的方法。
3.4.2. 第一步:创建自定义类实现Runnable接口

3.4.3. 第二步:创建测试类

3.5. 小结
3.5.1. 实现接口和继承Thread类比较
接口更适合多个相同的程序代码的线程去共享同一个资源。
接口可以避免java中的单继承的局限性。
接口代码可以被多个线程共享,代码和线程独立。
线程池只能放入实现Runable或Callable接口的线程,不能直接放入继承Thread的类。
扩充:在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。

3.5.2. Runnable和Callable接口比较
相同点:

两者都是接口;
两者都可用来编写多线程程序;
两者都需要调用Thread.start()启动线程;
不同点:

实现Callable接口的线程能返回执行结果;而实现Runnable接口的线程不能返回结果;
Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的不允许抛异常;
实现Callable接口的线程可以调用Future.cancel取消执行 ,而实现Runnable接口的线程不能。
4. 线程生命周期

4.1. 新建
new关键字创建了一个线程之后,该线程就处于新建状态。
JVM为线程分配内存,初始化成员变量值。
4.2. 就绪
当线程对象调用了start()方法之后,该线程处于就绪状态。
JVM为线程创建方法栈和程序计数器,等待线程调度器调度。
4.3. 运行
就绪状态的线程获得CPU资源,开始运行run()方法,该线程进入运行状态。

4.4. 阻塞
当发生如下情况时,线程将会进入阻塞状态
线程调用sleep()方法主动放弃所占用的处理器资源。
线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。
线程试图获得一个同步锁(同步监视器),但该同步锁正被其他线程所持有。
线程在等待某个通知(notify)。
程序调用了线程的suspend()方法将该线程挂起。但这个方法容易导致死锁,所以应该尽量避免使用该方法。
4.5. 死亡
线程会以如下3种方式结束,结束后就处于死亡状态:
run()或call()方法执行完成,线程正常结束。
线程抛出一个未捕获的Exception或Error。
调用该线程stop()方法来结束该线程,该方法容易导致死锁,不推荐使用。

--------不论你在什么时候开始,重要的是开始之后就不要停止。--------
订阅【Java直通车】获取免费Java书籍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值