一、进程和线程的区别
线程是CPU调度的最小单位,一个进程可以有多个线程
一个进程通常就是一个APP,有一个主线程,可以进行界面元素的操作,如果有耗时操作,必须开启子线程执行,否则会出现ANR
进程间数据独立,线程间数据共享
二、线程
1、线程的几种状态
新建状态New
就绪状态Runnable
运行状态Running
阻塞状态Blocked
死亡状态Dead
2、线程状态变化图
3、sleep、wait
- sleep:释放CPU资源,不释放锁
- wait:释放CPU资源,释放锁
4、join、yield
- join:在一个线程执行完后在执行
- yield:可以让当前线程从运行状态变成就绪状态,让所有线程去争夺执行权,包括自己本身
5、wait、notify、notifyAll
- wait:使当前线程进入休眠状态
- notify:在所有线程中随机唤醒一个,让它获得锁
- notifyAll:唤醒所有线程,让它们一起争夺锁,最后只有一个获得锁
注意
1、notify()或者notifyAll()方法并不是真正释放锁,必须等到synchronized方法或者语法块执行完才真正释放锁
2、都是Object对象的方法,必须在被synchronized同步的方法或代码块中调用,否则会报错
三、线程实现的方式
- 继承Thread
- 实现Runnable
- 实现Callable