개발 무지렁이

[Java] CPU스케쥴링에 따른 스레드(Thread) 상태와 상태 이동 메서드 본문

Backend/자바

[Java] CPU스케쥴링에 따른 스레드(Thread) 상태와 상태 이동 메서드

Gaejirang-e 2023. 8. 12. 19:08

🦔 스레드(Thread) 이름 지정
thread.setName("[스레드 이름]")
⚠️ 스레드 이름을 지정하지 않으면 "Thread-n"

⭐ 어떤 스레드가 현재 코드를 실행하고 있는지 check
  Thread thread = Thread.currentThread();
  System.out.println(thread.getName());

𐁍 스레드 상태
⚠️ 스레드 객체를 생성하고, start() 메서드를 호출하면, 바로 스레드가 실행되는 것이 아니다.
  실행대기상태(RUNNABLE)로 넘어가고,
  CPU 스케쥴링에 따라, 해당 스레드가 CPU를 점유할 때 run() 메서드를 실행한다.
  이 때 실행상태(RUNNING)가 되며, 스레드는 RUNNABLERUNNING을 번갈아가며
  run() 메서드를 조금씩 실행해나간다.
  run() 메서드가 종료되면 더이상 실행할 코드가 없어 종료상태(TERMINATED) 상태가 된다.

⚠️ RUNNING에서 가끔 일시정지상태(SUSPENDED)로 가기도 하는데
  SUSPENDED스레드가 실행할 수 없는 상태를 말한다.

🙈 SUSPENDED로 가는 Method:
sleep()
join() [다른 스레드의 run()메서드가 종료될 때까지, SUSPENDED]
wait() [동기화 블록내에서 스레드를 SUSPENDED]

🙉 SUSPENDED에서 벗어나는 Method:
interrupt() [InterruptedException을 발생 -> RUNNABLE or TERMINATED]
notify(), notifyAll() [wait() 메서드로 인해 SUSPENDED -> RUNNABLE]

🙊 RUNNABLE로 가는 Method:
yield() [RUNNING -> 다른 스레드에게 실행을 양보, RUNNABLE]

🏓 join() ex.
📜 SumThread.java

  public class SumThread extends Thread {
      private long sum;

      public long getSum() {
          return sum;
      }

      public void setSum(long sum) {
          this.sum = sum;
      }

      @Override
      public void run() {
          for(int i = 1; i <= 100; i++) {
              sum += i;
          }
      }
  }

📜 JoinExample.java

  public class JoinExample {
      public static void main(String[] args) {
          SumThread sumTread = new SumTread();
          sumThread.start();

          try {
              sumThread.join();
          } catch (InterruptedException e) { }
          System.out.println("1~100 합: " + sumThread.getSum());
          // 1~100 합: 5050
      }
  }                               

🏓 yield() ex.
📜 WorkThread.java

  public class WorkThread extends Thread {
      public boolean work = true;

      public WorkThread(String name) {
          setName(name);
      }

      @Override
      public void run() {
          while(true) {
              if(work) {
                  System.out.println(getName() + " 작업처리");
              } else {
                  Thread.yield();
              }
          }
      }
  }

📜 WorkThread.java

  public class YieldExample {
      public static void main(String[] args) {
          WorkThread workThreadA = new WorkThread("workThreadA");            WorkThread workThreadB = new WorkThread("workThreadB"");

          workThreadA.start();
          workThreadB.start();

          try {
              Thread.sleep(5000);
          } catch (InterruptedException e) { }
          workThreadA.work = false;

          try {
              Thread.sleep(10000);
          } catch (InterruptedException e) { }
          workThreadA.work = true;
      }
  }                               
Comments