Skip to content

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() 是让当前线程暂停执行,不涉及到对象类,也不需要获得对象锁。

正在精进