Java의 스레드가 다운사이클을 수행하면 어떤 결과가 발생합니까

3538 단어 java라인사순환
두 개의 라인이 병렬 운행하고 있다고 가정하면, 한 라인이 실행하는 코드에는 while (true) 와 같은 사순환이 포함되어 있다.이 스레드가 while (true) 에서 코드를 실행할 때, 다른 스레드가 실행될 기회가 있습니까?
예제 코드 (인터넷에서 코드)

public class Service {
  Object object1 = new Object();

  public void methodA() {
    synchronized (object1) {
      System.out.println("methodA begin");
      boolean isContinueRun = true;
      // 
      while (isContinueRun) {
        
      }
      System.out.println("methodA end");
    }
  }

  Object object2 = new Object();

  public void methodB() {
    synchronized (object2) {
      System.out.println("methodB begin");
      System.out.println("methodB end");
    }
  }
}
두 스레드 클래스의 구현은 다음과 같습니다.

import service.Service;

public class ThreadA extends Thread {

  private Service service;

  public ThreadA(Service service) {
    super();
    this.service = service;
  }

  @Override
  public void run() {
    service.methodA();
  }

}
스레드 A는 methodA (), methodA () 중 마지막 순환을 수행합니다.

import service.Service;

public class ThreadB extends Thread {

  private Service service;

  public ThreadB(Service service) {
    super();
    this.service = service;
  }

  @Override
  public void run() {
    service.methodB();
  }

}
스레드 B가methodB()를 실행하고, 스레드 A가methodA()의 while 사순환에 들어갈 때, 스레드 B의 실행이 완료될 수 있습니까? 
테스트 클래스

import service.Service;
import extthread.ThreadA;
import extthread.ThreadB;

public class Run {

  public static void main(String[] args) {
    Service service = new Service();

    ThreadA athread = new ThreadA(service);
    athread.start();

    ThreadB bthread = new ThreadB(service);
    bthread.start();
  }

}
스레드 A와 스레드 B가 얻은 대상 자물쇠는 같은 자물쇠가 아니기 때문에 결과에서 알 수 있듯이 스레드 B는 실행할 수 있다.한편, 스레드 A는while 사순환에 들어갔기 때문에 스레드 A가 계속 실행되고 실행되지만 (전체 프로그램이 끝나지 않음) 스레드 B는 끝납니다.
즉, 스레드 A가 while에서 계속 실행되고 있지만 CPU를 차지해야 한다는 것이다.그러나 스레드의 스케줄링은 JVM이나 운영체제가 책임지는 것이지 스레드 A가 while에서 계속 순환하고 있다고 해서 스레드 B가 CPU를 차지하지 못하는 것은 아니다.스레드 A의 경우 "컴퓨팅 집약적"작업에 해당합니다.만약에 우리의while 순환이 어떤 조건이 성립되었는지 끊임없이 테스트한다면 이런 방식은 CPU를 낭비하는 것이다. 구체적인 실례를 참고할 수 있다. JAVA 다중 스레드 간의 통신 방식 중의'스레드 간의 통신 방식'제2점while 윤문이다. 
서비스를java는 다음과 같이 수정됩니다.

public class Service {
//  Object object1 = new Object();

  public void methodA() {
    synchronized (this) {
      System.out.println("methodA begin");
      boolean isContinueRun = true;
      // 
      while (isContinueRun) {
        
      }
      System.out.println("methodA end");
    }
  }

//  Object object2 = new Object();

  public void methodB() {
    synchronized (this) {
      System.out.println("methodB begin");
      System.out.println("methodB end");
    }
  }
}
만약 스레드 A가 먼저 대상 자물쇠를 얻었을 때, while 순환으로 인해 스레드 A는 while 빈 순환 중입니다.스레드 B도 자물쇠를 얻을 수 없기 때문에methodB()를 실행할 수 없습니다.
한 라인이synchronized 방법에서 종료할 수 없고 자물쇠를 놓을 수 없으면 다른 라인은 무한히 기다릴 수밖에 없다는 것을 알 수 있다.
이상은 본고의 전체 내용입니다. 여러분이java다선정을 배우는 데 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기