面试八股——线程

本文详细探讨了线程的创建方式(继承Thread类、实现Runnable接口和Callable类)、线程池、Callable与Runnable的区别、run()与start()方法、线程状态转换、多线程顺序执行、notify与notifyAll以及wait()与sleep()方法的异同,以及锁的特性对比。
摘要由CSDN通过智能技术生成

进程与线程的对比

线程的创建方式⭐

继承Thread类

实现Runnable接口

实现Callable类

适用于需要获取返回值的线程。

线程池创建线程

Callable与Runnable的区别

1. 首先Runnable的run方法是没有返回值的,Callable的call方法有返回值。

2. Runnable不能向外抛出异常,Callable可向外抛出异常。

run()与start()方法的区别

start()方法是开启一个线程,来执行run()方法,start()方法只能被调用一次。run()方法封装了线程执行的代码,可调用多次。

Thread类中的线程的状态

新建、可执行、死亡、阻塞、等待、计时等待(后三个可都叫做阻塞态)。

状态的转换

通过new方法产生一个线程a,a为新建状态。a调用start()方法后变为可执行状态,当a执行完成后进入死亡状态。假如a需要竞争一把锁,如果没有获取到锁,则a处于阻塞态(资源竞争导致)。当调用wait()方法后,a进入等待状态,调用notify方法后,a进入执行态。使用sleep()方法后,a进入计时等待状态。

等待态与阻塞态的区别(个人理解):等待是线程主动进入的(wait方法),阻塞是线程被动进入(无法获取锁)。

多线程之间的顺序执行

多线程之间一般是并发执行的。如果需要使线程之间顺序执行,可使用以下方法:

1.join()方法

t1,t2,t3是3个线程,如果希顺序执行可见下图代码:

notify与notifyAll的区别

wait()与sleep()方法的区别⭐

相同点

wait()、wait(long time)、sleep(long time)都可让线程放弃CPU使用权,进入阻塞态。

不同点

方法归属不同:sleep方法是Thread的静态方法。wait()、wait(long time)是Object的成员方法,每个类都有。

唤醒时机不同

wait(long time)、sleep(long time)可以在固定时间后自动唤醒。wait(long time)、wait()只能通过notify唤醒。(wait(long time)有两种唤醒方式

锁的特性不同

重点是最后两点的对比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值