Java多线程(7)——线程的状态转换、线程间的通信——等待唤醒机制

本文深入探讨Java多线程的线程状态转换,包括新建、可运行、运行、阻塞、等待和终止状态。重点讲解线程间的通信——等待唤醒机制,详细阐述了wait、notify和notifyAll方法的使用,以及锁池(EntryList)和等待池(WaitSet)的概念。理解这些机制有助于更好地控制线程间的协作和资源利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.线程的状态转换

2.线程间的通信——等待唤醒机制

2.1 线程间的通信概念

2.2 等待唤醒机制

(1)什么是等待唤醒机制

(2)等待与唤醒机制涉及的三个方法

          1)等待:wait

          2)唤醒:notify和notifyAll

(3)锁池(EntryList)和等待池(WaitSet)

         1)锁池(EntryList

         2)等待池(WaitSet


1.线程的状态转换

在Thread内部类java.lang.Thread.State 这个枚举中给出了六种线程状态:

  • new Thread()之后,线程并没有被启动
  • 调用start方法后,线程启动,但不一定会立即执行,进入runnable(可运行)状态中的ready(就绪)状态,CPU调度进入running(运行)状态
  • 在running状态的线程,线程可能发生阻塞,比如在进入synchronized块或方法时,如果获取锁失败,会进入blocked状态,当获取到锁时,会回到ready状态
    • 阻塞状态下,具有CPU的执行资格,锁被释放会抢夺锁进行执行
  • blocked状态的时候不可能立即回到running(执行)状态,必须先回到ready状态
  • 运行中的线程还会进入等待状态,
    • 一个是有超时时间的等待(休眠状态),比如调用Object类的wait(long)方法,Thread类的join(long)方法等,从TIMED_WAITING状态可以
    • 另外一个是无超时时间的等待(无限等待状态),比如调用Thread类的join()方法或者LockSupport类的park方法或者Object类中的wait()方法
    • 这两种等待都可以通过notify或unpark结束等待状态,恢复到ready状态
    • 这两种等待状态放弃了CPU的执行资格,CPU空闲,也不会执行
  • 最终,各种状态下的线程都有可能结束,进入terminated状态(run方法执行完为正常结束)

2.线程间的通信——等待唤醒机制

2.1 线程间的通信概念

  • 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。
    • 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个 是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。

为什么要处理线程间通信?

  • 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

如何保证线程间通信有效利用资源?

  • 多个线程在处理同一个资源,并且任务不同时(如一个生产,一个消费),需要线程通信来帮助解决线程之间对同一个变量的使用或操作。
  • 多个线程在操作同一份数据时, 避免对同一共享变量的争夺。
  • 也就是我们需要通过一定的手段使各个线程能有效的利用资源。而这种手段即—— 等待唤醒机制。

2.2 等待唤醒机制

(1)什么是等待唤醒机制

  • 在一个线程进行了规定操作后,就进入等待状态(wait()), 等待其他线程执行完他们的指定代码过后 再将其唤醒(notify();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值