一、线程和进程的区别
进程:正在运行的程序,是操作系统分配系统资源(CPU、内存)的最小单位
线程:进程是由多个线程组成的,是操作系统调度CPU的最小单元,每个线程可以单独执行指令
进程更加重量级,操作系统创建和销毁进程需要更多的时间和资源,进程的相互通信更加复杂
线程更加轻量级,操作系统创建和销毁线程消耗时间和资源更少,同一个进程的线程可以共享内存空间,通信更容易
二、线程的实现方法
Java的实现有4个:
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
4、通过线程池创建
三、线程的生命周期
线程生命周期:
-
新建
-
就绪
-
运行
-
阻塞
-
死亡
四、线程的常用方法
方法名 | 说明 |
---|---|
* start() | 启动线程 |
stop() | 停止线程,可能导致重要资源无法释放,出现死锁等问题 |
interrupt() | 中断线程,可以配合异常处理停止线程 |
* run() | 执行线程的核心指令 |
setName(String) | 设置名字 |
getName() | 获得名字 |
* sleep(long) | Thread的静态方法,让当前线程睡眠一定时间(毫秒) |
* setPriority(int) | 设置优先级,从低到高,1到10,优先级高的线程抢占cpu几率更高 |
yield() | 放弃占用CPU一会,马上回到就绪状态 |
suspend() | 禁用,当前线程挂起(暂停) |
resume() | 禁用,当前线程恢复 |
* setDaemon(boolean) | 设置后台线程,默认是false |
join() | 合并其它线程,让其它线程先执行完,再执行自己的代码 |
五、相关线程基础问答
如何停止线程?
1) stop 禁用,可能导致重要资源无法释放,出现死锁等问题
2) 等待run方法执行结束
3) 在run方法加入条件,中途停止run方法
4) 执行interrupt方法,进行异常处理的时候停止线程
sleep和wait的联系和区别
联系:都可以让线程进入阻塞状态
区别:
-
调用对象不同:sleep是线程调用的,wait是锁对象(Object)调用的
-
释放锁不同:sleep不会让线程释放锁,wait会让线程释放锁
-
唤醒机制不同:sleep只能等睡眠时间结束,wait可以等时间结束也可以通过notify方法唤醒