Java 线程和操作系统的线程有啥区别?
默认 Java 线程的本质其实就是操作系统的线程,两者一对一关系,其他对应关系很少,基本不用 线程的程序计数器、虚拟机栈和本地方法栈私有,每个线程有自己的上下文,堆和方法区共享 创建方法:
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口
- 使用线程池
- 使用
CompletableFuture类 - 上面的只是创建线程对象,实际创建线程最终都是通过
new Thread().start()创建- 直接调用 Thread 类的 run 方法只是将其作为一个普通方法执行,而不是创建线程
- 一般通过线程池创建,不建议手动创建
生命周期:
- 初始态、运行态、阻塞态、等待态、终止态
Thread#sleep() 方法和 Object#wait() 方法对比
共同点:两者都可以暂停线程的执行。
区别:
sleep()方法没有释放锁,而wait()方法释放了锁 。wait()通常被用于线程间交互/通信,sleep()通常被用于暂停执行。wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()方法执行完成后,线程会自动苏醒,或者也可以使用wait(long timeout)超时后线程会自动苏醒。sleep()是Thread类的静态本地方法,wait()则是Object类的本地方法。为什么这样设计呢?下一个问题就会聊到。
为什么 wait() 方法不定义在 Thread 中?
wait() 是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁。每个对象(Object)都拥有对象锁,既然要释放当前线程占有的对象锁并让其进入 WAITING 状态,自然是要操作对应的对象(Object)而非当前的线程(Thread)。
类似的问题:为什么 sleep() 方法定义在 Thread 中?
因为 sleep() 是让当前线程暂停执行,不涉及到对象类,也不需要获得对象锁。
