Java의 스레드가 다운사이클을 수행하면 어떤 결과가 발생합니까
예제 코드 (인터넷에서 코드)
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다선정을 배우는 데 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.