多线程入门(3):线程的生命周期

川长思鸟来 2023-06-27 12:55 149阅读 0赞
  1. //java.lang.Thread.State
  2. public enum State {
  3. NEW,
  4. RUNNABLE,
  5. BLOCKED,
  6. WAITING,
  7. TIMED_WAITING,
  8. TERMINATED;
  9. }

1 状态间的转化图示

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95dWFueXUuYmxvZy5jc2RuLm5ldA_size_16_color_FFFFFF_t_70

展示线程的NEW、RUNNABLE、Terminated状态。即使是正在运行,也是Runnable状态,而不是Running。

  1. /**
  2. * 展示线程的NEW、RUNNABLE、Terminated状态。即使是正在运行,也是Runnable状态,而不是Running。
  3. */
  4. public class NewRunnableTerminated {
  5. public static void main(String[] args) {
  6. Thread thread = new Thread(() -> {
  7. for (int i = 0; i < 1000; i++) {
  8. System.out.println(i);
  9. }
  10. });
  11. //打印出NEW的状态
  12. System.out.println(thread.getState());
  13. thread.start();
  14. System.out.println(thread.getState());
  15. try {
  16. Thread.sleep(10);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. //打印出RUNNABLE的状态,即使是正在运行,也是RUNNABLE,而不是RUNNING
  21. System.out.println(thread.getState());
  22. try {
  23. Thread.sleep(100);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. //打印出TERMINATED状态
  28. System.out.println(thread.getState());
  29. }
  30. }

展示Blocked, Waiting, TimedWaiting

  1. public class BlockedWaitingTimedWaiting implements Runnable{
  2. public static void main(String[] args) {
  3. BlockedWaitingTimedWaiting runnable = new BlockedWaitingTimedWaiting();
  4. Thread thread1 = new Thread(runnable);
  5. thread1.start();
  6. Thread thread2 = new Thread(runnable);
  7. thread2.start();
  8. try {
  9. Thread.sleep(5);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. //打印出Timed_Waiting状态,因为正在执行Thread.sleep(1000);
  14. System.out.println(thread1.getState());
  15. //打印出BLOCKED状态,因为thread2想拿得到sync()的锁却拿不到
  16. System.out.println(thread2.getState());
  17. try {
  18. Thread.sleep(1300);
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. //打印出WAITING状态,因为执行了wait()
  23. System.out.println(thread1.getState());
  24. }
  25. @Override
  26. public void run() {
  27. syn();
  28. }
  29. /**
  30. * 线程1进入方法后sleep(1000)
  31. * 线程2陷入阻塞状态(Blocked)
  32. */
  33. private synchronized void syn() {
  34. try {
  35. Thread.sleep(1000);
  36. wait();
  37. } catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

2 阻塞状态

一般习惯而言,把 Blocked(被阻塞)、Waiting(等待)、Timed_waiting(计时等待)都称为阻塞状态

发表评论

表情:
评论列表 (有 0 条评论,149人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线生命周期

    这两天在看线程的东西,根据牛人的博客总结了一些:每个Java程序至少包含一个线程:主线程。其它线程都是通过Thread构造器或实例化继承类Thread的类来创建的。正在运行的线

    相关 Java线生命周期

    新生状态(New): 用new关键字建立一个线程对象后,该线程对象就处于新生状态。 处于新生状态的线程有自己的内存空间,通过调用start进入就绪状态,但该线程并未真正