java多线程复习与巩固(三)

Java中线程的状态分为6种。

新建(NEW):新创建的一个线程对象。

可运行(RUNNABLE):也叫就绪状态。线程对象创建后,其他线程(比如main线程)调用该线程的start 方法。该状态的线程位于可运行线程池中,等待被线程调度选择,获取CPU使用权。

运行状态(RUNNING):指线程获取了CPU时间片,执行具体的程序指令。

阻塞(BLOCKED):线程因为某种原因处于阻塞状态,让出了CPU时间片段。

等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)

超时等待(TIMED__WAITING):该状态在指定时间后自行返回。

终止(TERMINATED):表示该线程已经执行完毕。

线程状态图:

Java中sleep,wait,yield,join的区别

  1. sleep()方法
  • 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用.
  • sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
  1. wait()方法
  • 在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
  • 当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
  • 唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
  • waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
  1. yield方法
  • 暂停当前正在执行的线程对象。
  • yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
  • yield()只能使同优先级或更高优先级的线程有执行的机会。
  • 调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。
  1. join方法
  • 等待该线程终止。
  • 等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
  • 在很多情况下,主线程创建并启动了线程,如果子线程中药进行大量耗时运算,主线程往往将早于子线程结束之前结束。这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到join()方法了。方法join()的作用是等待线程对象销毁。

猜你喜欢

转载自blog.csdn.net/weixin_38700984/article/details/106172410