1.什么是 进程和线程?
进程:程序的一次执行过程,或者是一个正在运行的程序,是个动态的过程,:有它自身的产生、存在和消亡的过程。——生命周期。同时,进程还作为资源分配的单位。系统在运行时会为每个进程分配不同的内存区域.
线程:进程可以细化为线程,是一个程序内部执行的一条路径。
3.resume() 和suspend()
thread.suspend()方法 暂停线程,使用 thread.resume()恢复暂停的线程。
①当某个线程的suspend()方法被调用时,该线程会被挂起。如果该线程占有了锁,则它不会释放锁。即,线程在挂起的状态下还持有锁。
resume:该方法很功能很简单,就是恢复 因suspend()方法挂起的线程,使之重新能够获得CPU执行。
2.sleep() 和 wait() 有什么区别? 或 线程的通信
- sleep() 是线程类(Thread)的方法,使线程阻塞多长时间,单位为毫秒,会把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
- wait()是Object类的方法,调用此方法,必须在同步代码块或者同步方法中。对此对象调用wait方法导致本线程释放锁,进入阻塞状态,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
- 简单来说,1,一个释放锁,一个不放;2,一个是Object类的,一个是Thread 类的.
3.线程的四种创建方式
- 继承Thread
- 实现implements接口
- 实现callable接口( call()方法用来执行该线程,代替run())
- Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
- Call方法可以抛出异常,run方法不可以。
- 支持泛型
- 使用线程池
4.线程的安全(同步)问题: synchronized
问题:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有 执行完,另一个线程参与进来执行。导致共享数据的错误。
解决办法:
- 同步代码块
操作共享数据的代码,即为被同步的代码.synchronized( 同步监视器 ){
//被同步的代码
}
共享数据:多个线程共同操作的数据。
同步监视器: 俗称锁 🔒 。 任何一个对象都可以充当,
如果要解决线程的安全问题,必须用同一 把 🔒 !
局限性:操作同步码块后,只能有一个线程参与,其他线程等待,相当于单线程。
runable()用 this充当 锁, Thread 考虑 用当前类(类.class)充当。
- 同步方法
使用条件:操作共享数据 的代码完整的声明在一个方法中,就可以用把该方法声明为synchronizaed。
- Lock 锁
Lock 锁 需要手动启动同步,手动结束同步。lock . lock(); lock.uplock();
线程的运行状态
New 、Runnable(就绪) 、Running (运行)、Blocked (阻塞)、Dead(死亡)。