>  기사  >  Java  >  자바 멀티스레딩 인터뷰 질문

자바 멀티스레딩 인터뷰 질문

王林
王林앞으로
2020-09-17 17:23:501642검색

자바 멀티스레딩 인터뷰 질문

121, 스레드란 무엇인가요?能 스레드는 운영 체제가 작업 스케줄링을 수행하는 가장 작은 단위이며 프로세스에 포함되어 실제 운영 단위입니다. 프로그래머는 다중 프로세서 프로그래밍에 이를 사용할 수 있으며, 다중 스레딩을 사용하여 계산 집약적인 작업 속도를 높일 수 있습니다. 예를 들어 하나의 스레드가 작업을 완료하는 데 100밀리초가 걸린다면 10개의 스레드를 사용하여 작업을 완료하는 데는 10밀리초밖에 걸리지 않습니다.

(더 많은 관련 면접 질문 추천 :

java 면접 질문 및 답변

)122, 스레드와 프로세스의 차이점은 무엇인가요?

           스레드는 프로세스의 하위 집합입니다. 프로세스에는 여러 스레드가 있을 수 있으며 각 스레드는 서로 다른 작업을 병렬로 수행합니다. 서로 다른 프로세스는 서로 다른 메모리 공간을 사용하며 모든 스레드는 동일한 메모리 공간을 공유합니다. 각 스레드에는 로컬 데이터를 저장하기 위한 별도의 스택 메모리가 있습니다.

123, Java에서 스레드를 구현하는 방법은 무엇입니까? V 두 가지 방법: java.lang.thread 클래스의 인스턴스는 스레드이지만 실행하려면 java.lang.runnable 인터페이스를 호출해야 합니다. 스레드 클래스 자체를 실행 가능한 인터페이스라고 부르기 때문에 java.lang.thread 클래스를 상속받을 수 있습니다. lang.thread 클래스 또는 Runnable 인터페이스를 직접 호출하여 run() 메서드를 재정의하여 스레드를 구현합니다.

124, Java 키워드 휘발성과 동기화의 기능과 차이점은 무엇입니까?

1. 휘발성

수정하는 변수는 복사본을 유지하지 않고 메인 메모리에 직접 접근합니다.
Java 메모리 모델에는 주 메모리가 있고 각 스레드에는 자체 메모리(예: 레지스터)도 있습니다. 성능을 위해 스레드는 액세스하는 변수의 복사본을 자체 메모리에 보관합니다. 이런 식으로 한 스레드의 메모리에 있는 동일한 변수의 값이 특정 순간에 다른 스레드의 메모리에 있는 값이나 메인 메모리에 있는 값과 일치하지 않을 수 있는 상황이 발생합니다. 변수를 휘발성으로 선언한다는 것은 변수가 언제든지 다른 스레드에 의해 수정될 수 있으므로 스레드 메모리에 캐시될 수 없음을 의미합니다.

2. 동기화



메서드나 코드 블록을 수정하는 데 사용되면 최대 하나의 스레드가 동시에 코드를 실행하도록 보장할 수 있습니다.

1. 두 개의 동시 스레드가 동일한 개체 개체의 동기화된(this) 동기화 코드 블록에 액세스하는 경우 한 번에 하나의 스레드만 실행할 수 있습니다. 다른 스레드는 이 코드 블록을 실행하기 전에 현재 스레드가 이 코드 블록 실행을 완료할 때까지 기다려야 합니다.

      2. 그러나 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 다른 스레드는 여전히 객체의 동기화되지 않은(this) 동기화 코드 블록에 액세스할 수 있습니다. 세 번째, 특히 핵심은 스레드가 Object의 동기화된(this) 동기화 코드 블록에 액세스할 때 Object의 다른 모든 동기화된(this) 동기화 코드 블록에 대한 다른 스레드가 차단된다는 것입니다.

          4. 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 이 객체의 객체 잠금을 획득합니다. 결과적으로 개체 개체의 모든 동기화된 코드 부분에 대한 다른 스레드의 액세스가 일시적으로 차단됩니다.

5. 위의 규칙은 다른 객체 잠금에도 적용됩니다.

125, 다른 스레드 수명주기는 무엇입니까?

Java 프로그램에서 새 스레드를 생성하면 해당 스레드의 상태는 New입니다. 스레드의 start() 메서드를 호출하면 상태가 Runnable로 변경됩니다. 스레드 스케줄러는 Runnable 스레드 풀의 스레드에 CPU 시간을 할당하고 상태를 실행 중으로 변경합니다. 다른 스레드 상태에는 대기 중, 차단됨, 작동 불능 등이 있습니다.

126, 스레드 우선순위에 대해 어떻게 이해하고 있나요?是 각 스레드에는 우선순위가 있습니다. 일반적으로 우선순위가 높은 스레드는 런타임 시 우선순위를 갖지만 이는 스레드 스케줄링의 구현에 따라 다릅니다. 이 구현은 운영 체제(OS 종속)와 관련됩니다. 스레드의 우선순위를 정의할 수 있지만 이는 우선순위가 높은 스레드가 우선순위가 낮은 스레드보다 먼저 실행된다는 것을 보장하지 않습니다. 스레드 우선순위는 int 변수(1-10)입니다. 1은 가장 낮은 우선순위를 나타내고 10은 가장 높은 우선순위를 나타냅니다.

127, 교착상태란 무엇인가요? 교착상태를 분석하고 방지하는 방법은 무엇입니까?

            교착 상태는 2개 이상의 스레드가 영원히 차단되는 상황을 의미합니다. 이 상황에는 최소 2개 이상의 스레드와 2개 이상의 리소스가 필요합니다. ㅋㅋㅋ Java 애플리케이션의 스레드 덤프를 살펴보십시오. BLOCKED 상태에 있는 스레드와 그들이 기다리고 있는 리소스를 찾아야 합니다. 각 리소스에는 고유한 ID가 있으며, 이 ID를 사용하여 이미 개체 잠금을 소유한 스레드를 찾을 수 있습니다.

        중첩된 잠금을 피하고, 필요한 경우에만 잠금을 사용하고, 무기한 대기를 피하는 것이 교착 상태를 피하는 일반적인 방법입니다.

128, 스레드 안전성이란 무엇입니까? Vector는 스레드로부터 안전한 클래스인가요?

코드가 있는 프로세스에서 동시에 실행 중인 여러 스레드가 있는 경우 이러한 스레드가 이 코드를 동시에 실행할 수 있습니다. 각 실행의 결과가 단일 스레드 실행의 결과와 동일하고 다른 변수의 값도 예상과 동일하면 스레드로부터 안전합니다. 스레드로부터 안전한 카운터 클래스는 동일한 인스턴스 개체가 여러 스레드에서 사용될 때 계산 오류를 일으키지 않습니다. 분명히 컬렉션 클래스를 스레드로부터 안전하고 스레드로부터 안전하지 않은 두 그룹으로 나눌 수 있습니다. Vector는 동기화된 메서드를 사용하여 스레드 안전성을 달성하는 반면, 이와 유사한 ArrayList는 스레드로부터 안전하지 않습니다.


(관련 동영상 튜토리얼 추천:

java 강좌

)

129, Java에서 스레드를 중지하는 방법은 무엇인가요? ㅋㅋㅋ                    Java는 매우 풍부한 API를 제공하지만 스레드 중지를 위한 API는 제공하지 않습니다. JDK 1.0에는 원래 stop(), suspens() 및 이력서()와 같은 일부 제어 메서드가 있었지만 잠재적인 교착 상태 위협으로 인해 후속 JDK 버전에서는 더 이상 사용되지 않습니다. 스레드를 중지하는 안전한 방법. run() 또는 call() 메서드가 실행되면 스레드가 자동으로 종료됩니다. 스레드를 수동으로 종료하려면 휘발성 부울 변수를 사용하여 run() 메서드 루프를 종료하거나 작업을 취소하여 스레드를 중단할 수 있습니다. 130, ThreadLocal은 무엇입니까? ThreadLocal은 스레드의 로컬 변수를 생성하는 데 사용됩니다. 객체의 모든 스레드가 전역 변수를 공유하므로 이러한 변수는 스레드로부터 안전하지 않습니다. 그러나 동기화를 사용하지 않으려면 ThreadLocal 변수를 선택할 수 있습니다.拥 각 스레드에는 자체 Thread 변수가 있습니다. get() set() 메서드를 사용하여 기본값을 얻거나 스레드 내에서 값을 변경할 수 있습니다. ThreadLocal 인스턴스는 일반적으로 연결된 스레드 상태가 비공개 정적 속성이기를 원합니다.

131, Sleep(), suspens() 및 wait()의 차이점은 무엇입니까?

             Thread.sleep()은 지정된 시간에 현재 스레드를 "실행할 수 없음" 상태로 설정합니다. 스레드는 항상 개체의 모니터를 보유합니다. 예를 들어, 스레드가 현재 동기화된 블록이나 메서드에 있는 경우 다른 스레드는 해당 블록이나 메서드에 들어갈 수 없습니다. 다른 스레드가 Interrupt() 메서드를 호출하면 "휴면" 스레드가 깨어납니다.

​​ ​​참고: sleep()은 정적 메서드입니다. 이는 현재 스레드에 대해서만 유효하다는 것을 의미합니다. 일반적인 실수는 t.sleep()을 호출하는 것입니다(여기서 t는 현재 스레드와 다른 스레드입니다). t.sleep()이 실행되더라도 t 스레드가 아닌 현재 스레드가 절전 모드로 전환됩니다. t.sun()은 오래된 방법입니다. suspend()를 사용하면 스레드가 정체 상태에 들어갈 수 있습니다. Suspend()는 쉽게 교착 상태 문제를 일으킬 수 있습니다. ㅋㅋㅋ                                                                                               object.wait()는 현재 스레드를 "비실행" 상태로 둡니다. nable" 상태. sleep()과의 차이점은 wait가 스레드가 아닌 개체의 메서드라는 것입니다. object.wait()를 호출할 때 스레드는 먼저 이 개체의 개체 잠금을 획득해야 합니다. 현재 스레드는 잠금 개체에 대한 동기화를 유지하고 현재 스레드를 대기 대기열에 추가해야 합니다. 그런 다음 다른 스레드가 동일한 개체 잠금을 동기화할 수 있습니다. object.notify()를 호출하면 원래 대기 스레드를 깨운 다음 ​​잠금을 해제합니다. 기본적으로 wait()/notify()는 sleep()/interrupt()와 비슷하지만 전자가 객체 잠금을 획득해야 한다는 점만 다릅니다.

132, 스레드 기아란 무엇이며 라이브락은 무엇입니까?

                          모든 스레드가 차단되거나 필수 리소스가 유효하지 않아 처리할 수 없는 경우 리소스를 사용할 수 있게 해주는 비차단 스레드가 없습니다. Java API의 스레드 라이브록은 다음과 같은 상황에서 발생할 수 있습니다. 1. 모든 스레드가 프로그램에서 Object.wait(0)을 실행할 때 매개변수가 0인 wait 메서드가 사용됩니다. 프로그램은 스레드가 해당 객체에 대해 Object.notify() 또는 Object.notifyAll()을 호출할 때까지 실시간 잠금을 수행합니다.

2. 모든 스레드가 무한 루프에 갇힌 경우.

133, 자바 타이머 클래스란 무엇인가요? 특정 시간 간격으로 작업을 생성하는 방법은 무엇입니까?

java.util.Timer는 미래의 특정 시간에 스레드가 실행되도록 예약하는 데 사용할 수 있는 도구 클래스입니다. Timer 클래스는 일회성 작업이나 주기적인 작업을 예약하는 데 사용할 수 있습니다.

java.util.TimerTask는 Runnable 인터페이스를 구현하는 추상 클래스입니다. 자체 예약 작업을 생성하고 Timer를 사용하여 실행을 예약하려면 이 클래스를 상속해야 합니다.

134. Java에서 동기화된 컬렉션과 동시 컬렉션의 차이점은 무엇인가요?

          동기화된 컬렉션과 동시 컬렉션 모두 멀티스레딩 및 동시성에 적합한 스레드로부터 안전한 컬렉션을 제공하지만 동시 컬렉션은 확장성이 더 뛰어납니다.

????????

Java5에서는 스레드 안전성을 제공할 뿐만 아니라 잠금 분리 및 내부 파티셔닝과 같은 최신 기술을 통해 확장성을 향상시키는 ConcurrentHashMap과 같은 동시 컬렉션을 도입했습니다.

135, 동기화 방식과 동기화 블록 중 어느 것이 더 나은 선택인가요?

            동기화된 블록은 전체 개체를 잠그지 않기 때문에 더 나은 선택입니다(물론 전체 개체를 잠그도록 할 수도 있습니다). 동기화된 메서드는 클래스에 관련되지 않은 동기화된 블록이 여러 개 있는 경우에도 전체 개체를 잠급니다. 이로 인해 일반적으로 해당 블록의 실행이 중지되고 개체에 대한 잠금을 획득할 때까지 기다려야 합니다.

136, 스레드 풀이란 무엇입니까? 왜 그것을 사용합니까?费 스레드를 생성하는 데에는 비용이 많이 드는 리소스와 시간이 소요되며, 작업이 다가오면 시간이 길어지고 프로세스에서 생성할 수 있는 스레드 수가 제한됩니다. ㅋㅋㅋ                    이러한 문제를 방지하기 위해 프로그램이 시작될 때 처리에 응답하기 위해 여러 개의 스레드를 생성하며, 이를 스레드 풀이라고 하며, 그 내부의 스레드를 작업자 스레드라고 합니다.

JDK1.5부터 Java API는 다양한 스레드 풀을 생성할 수 있도록 Executor 프레임워크를 제공합니다. 예를 들어 단일 스레드 풀은 고정된 수의 스레드 풀 또는 캐시 스레드 풀(단기 작업이 많은 프로그램에 적합한 확장 가능한 스레드 풀)을 한 번에 하나의 작업을 처리합니다.

137, Java에서 InvokeAndWait와 InvokeLater의 차이점은 무엇입니까?

이 두 가지 방법은 이벤트 전달 스레드 대신 현재 스레드에서 GUI 구성 요소를 업데이트하기 위해 Swing API에서 Java 개발자에게 제공됩니다. InvokeAndWait()는 진행률 표시줄과 같은 GUI 구성 요소를 동기적으로 업데이트하고 나면 진행률 표시줄도 이에 따라 변경되어야 합니다. 진행 상황이 여러 스레드에 의해 추적되는 경우에는 InvokeAndWait() 메서드를 호출하여 그에 따라 구성 요소를 업데이트하도록 이벤트 전달 스레드를 요청합니다. InvokeLater() 메서드는 업데이트 구성 요소를 비동기적으로 호출합니다.

138, 멀티스레딩에서 바쁜 루프란 무엇입니까?

바쁜 루프는 프로그래머가 스레드를 대기시키기 위해 루프를 사용하는 경우입니다. CPU 제어를 포기합니다. 바쁜 루프는 CPU를 포기하지 않고 단지 빈 루프를 실행합니다. 이것의 목적은 CPU 캐시를 보존하는 것입니다. ㅋㅋㅋ                                        멀티 코어 시스템에서는 대기 중인 스레드가 깨어나면 다른 코어에서 실행되어 캐시를 재구성할 수 있습니다. 이를 사용하면 캐시 재구축을 방지하고 재구축을 기다리는 시간을 줄일 수 있습니다.

관련 권장 사항:

Java 입문 튜토리얼

위 내용은 자바 멀티스레딩 인터뷰 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제