1.并行与并发的区别?
- 并行:多个处理器或多核处理器同时处理多个任务
- 并发:多个任务在同一个CPU核上,按细分的时间片轮流执行,从逻辑上来看这些任务是同时执行的。
2.线程和进程的区别
一个程序下至少有一个进程,一个进程下至少有一个线程。一个进程下也可以有多个线程来增加程序的执行速度。
3.守护线程是什么?
守护线程是运行在后台的一种特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。在JAVA中垃圾回收线程就是特殊的守护线程。
4.创建线程有那几种方法?
- 继承 Thread 类 重写run方法
- 实现Runnable接口
- 实现Callable接口
5.Runnable 和 Callable 的区别?
Runnable没有返回值,Callable 可以拿到返回值,Callable可以看作是Runnable的补充。
6.线程状态有哪些?
- NEW 尚未启动
- RUNNABLE 正在执行中
- BLOCKED 阻塞的(被被同步锁或IO锁阻塞)
- WAITING 永久等待状态
- TIMED_WAITING 等待指定的时间重新被唤醒的状态
- TERMINATED 执行完成
7.sleep() 和 wait() 的区别?
- 类不同:sleep() 来自Thread, wait() 来自Object.
- 释放锁:sleep() 不释放锁;wait() 释放锁。
- 用法不同:sleep() 到时间会自动恢复;wait() 可以使用 notify() / notifyAll() 直接唤醒。
8.notify() 和 notifyAll() 的区别?
notifyAll()会唤醒所有的线程,notify只会唤醒一个线程。
notifyAll()调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。notify() 只会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制。
9.线程的run() 与 srart() 有什么区别?
start()方法用于启动线程, run() 方法用于执行线程的运行时代码,run() 可以重复调用,start() 只能调用一次。