아래는 Java 스레드와 관련된 인기있는 인터뷰 질문입니다. 인터뷰를 준비하는 데 사용할 수 있습니다.
1) 스레드 란 무엇입니까?
스레드는 운영 체제가 운영 및 스케줄링을 수행 할 수있는 가장 작은 장치입니다. 프로세스에 포함되어 있으며 프로세스의 실제 운영 장치입니다. 프로그래머는이를 통해 멀티 프로세서를 프로그래밍 할 수 있으며 멀티 스레딩을 사용하여 운영 집약적 작업 속도를 높일 수 있습니다. 예를 들어, 스레드가 작업을 완료하는 데 100 밀리 초가 걸리면 스레드가 10 스레드를 사용하여 작업 변경을 완료하는 데 10 밀리 초 밖에 걸리지 않습니다. Java는 언어 수준에서 멀티 스레딩에 대한 탁월한 지원을 제공하며 좋은 판매 지점이기도합니다. 자세한 내용은 여기를 클릭하십시오.
2) 스레드와 프로세스의 차이점은 무엇입니까?
스레드는 프로세스의 하위 집합입니다. 프로세스에는 많은 스레드가있을 수 있으며 각 스레드는 다른 작업을 병렬로 수행합니다. 다른 프로세스는 다른 메모리 공간을 사용하는 반면 모든 스레드는 동일한 메모리 공간을 공유합니다. 스택 메모리를 엉망으로 만들지 마십시오. 각 스레드에는 로컬 데이터를 저장하기위한 별도의 스택 메모리가 있습니다. 자세한 내용은 여기를 클릭하십시오.
3) Java에서 스레드를 구현하는 방법은 무엇입니까?
언어 수준에는 두 가지 방법이 있습니다. java.lang.thread 클래스의 인스턴스는 스레드이지만 java.lang.runnable 인터페이스를 호출하여 실행해야합니다. 스레드 클래스 자체가 호출 가능한 런 가능한 인터페이스이므로 java.lang.thread 클래스를 상속하거나 Runnable 인터페이스를 직접 호출하여 run () 메소드를 재정의하여 스레드를 구현할 수 있습니다. 자세한 내용은 여기를 클릭하십시오.
4) 실행 가능 또는 실을 사용 하시겠습니까?
이 질문은 이전 질문에 대한 후속 조치입니다. 모든 사람은 스레드 클래스를 상속하거나 실행 가능한 인터페이스를 호출하여 스레드를 구현할 수 있다는 것을 알고 있습니다. 문제는 어떤 방법이 더 낫습니까? 어떤 상황에서 그것을 사용해야합니까? Java가 여러 클래스 상속을 지원하지 않지만 여러 인터페이스를 호출 할 수 있다는 것을 알고 있다면이 질문은 대답하기 쉽습니다. 따라서 다른 클래스를 상속하려면 물론 런닝 가능한 인터페이스를 호출하는 것이 좋습니다. 자세한 내용은 여기를 클릭하십시오.
6) 스레드 클래스에서 start ()와 run () 메소드의 차이점은 무엇입니까?
이 질문은 종종 묻지 만,이 질문은 여전히 Java 스레딩 모델에 대한 면접관의 이해와 이것과 여전히 구별 할 수 있습니다. start () 메소드는 새로 생성 된 스레드를 시작하는 데 사용되며 run () 메소드는 내부적으로 호출되며 이는 run () 메소드를 직접 호출하는 효과와 다릅니다. run () 메소드를 호출하면 원래 스레드에서만 호출됩니다. 새 스레드가 시작되지 않으면 start () 메소드가 새 스레드를 시작합니다. 자세한 내용은 여기를 클릭하십시오
7) Java에서 달리기와 호출 가능한 차이점은 무엇입니까?
실행 가능하고 호출 가능한 것은 다른 스레드에서 실행되는 작업을 나타냅니다. JDK1.0 이후 Runnable을 사용할 수 있으며 JDK1.5에 Callable이 추가되었습니다. 그들의 주요 차이점은 Call () Callable 메소드가 값을 반환하고 예외를 던질 수 있다는 것입니다. run () 방법에는 이러한 기능이 없다는 것입니다. Callable은 계산 결과로로드 된 미래의 객체를 반환 할 수 있습니다. 내 블로그에는 더 자세한 지침이 있습니다.
8) Java의 Cyclicbarrier와 Countdownlatch의 차이점은 무엇입니까?
Cyclicbarrier와 CountdownLatch는 모두 다른 스레드를 기다리게하는 데 사용될 수 있습니다. CyclicBarrier와 달리 CountdownLatch는 재사용 할 수 없습니다. 자세한 정보 및 샘플 코드를 보려면 여기를 클릭하십시오.
9) Java 메모리 모델이란 무엇입니까?
Java 메모리 모델은 다른 메모리 아키텍처, CPU 및 운영 체제간에 결정적으로 행동하도록 Java 프로그램을 지정하고 안내합니다. 다중 스레딩 상황에서 특히 중요합니다. Java 메모리 모델은 한 스레드에 의한 변경 사항이 다른 스레드에 보이고 관계가 먼저 발생하도록 할 수 있습니다. 이 관계는 동시 프로그래밍에서 프로그래머를 더 명확하게하기위한 몇 가지 규칙을 정의합니다. 예를 들어 관계가 먼저 있으면 다음과 같습니다.
스레드 내의 코드는 순서대로 실행될 수 있으며, 이는 프로그램 주문 규칙이라고합니다.
동일한 잠금의 경우 잠금 해제 작업이 제 시간에 발생하는 다른 잠금 작업 전에 발생하며 관리 잠금 규칙이라고도합니다.
휘발성에 대한 이전의 쓰기 작업은 휘발성 변수 규칙이라고도하는 휘발성의 다음 읽기 작업 전입니다.
스레드 내 작업은 스레드 시작 규칙이라고도하는이 스레드의 시작 () 후에는 호출되어야합니다.
스레드의 모든 작업은 스레드가 종료되기 전에 종료됩니다.
객체의 종료 작업은 객체가 구성된 후에야하며, 이는 객체 종단 규칙이라고도합니다.
전이
Java 메모리 모델에 대한 이해를 심화시키기 위해 "Java Concurrency Programming Practice"의 16 장을 읽는 것이 좋습니다.
10) Java의 휘발성 변수는 무엇입니까?
휘발성은 멤버 변수에서만 사용할 수있는 특수 수정 자입니다. Java 동시 프로그램에 동기 클래스가 부족한 경우, 멤버 변수에 대한 멀티 스레딩 작업은 다른 스레드에 투명합니다. 휘발 변수는 이전 쓰기 작업 후에 다음 읽기 작업이 발생하도록 보장 할 수 있으며, 이는 이전 질문의 휘발성 변수 규칙입니다. 보다 휘발성 관련 컨텐츠를 보려면 여기를 클릭하십시오.
11) 스레드 안전이란 무엇입니까? 벡터는 스레드 안전 클래스입니까? (자세한 내용은 여기를 참조하십시오)
코드가있는 프로세스에있는 경우 동시에 여러 스레드가 실행되며 이러한 스레드는 동시에이 코드를 실행할 수 있습니다. 각 실행 결과가 단일 스레드 실행 결과와 동일하고 다른 변수의 값이 예상과 동일하면 스레드 안전입니다. 스레드-안전 카운터 클래스의 동일한 인스턴스 객체는 여러 스레드에서 사용할 때 계산 오류가 발생하지 않습니다. 분명히 컬렉션 클래스를 스레드 안전 및 비 스레드-안전의 두 그룹으로 나눌 수 있습니다. 벡터는 동기화 방법을 사용하여 스레드 안전성을 달성하는 반면 ArrayList는 스레드 안전이 아닙니다.
12) 자바의 인종 조건은 무엇입니까? 예를 들어보세요.
레이스 조건으로 인해 프로그램의 동시 상황에서 일부 버그가 발생합니다. 멀티 스레딩이 일부 자원과 경쟁하면 레이스 조건이 발생합니다. 실행될 첫 번째 프로그램이 실패하고 나중에 실행되면 일부 불확실한 버그가 전체 프로그램에 나타납니다. 이러한 버그는 스레드 간의 임의의 경쟁으로 인해 감지하고 반복하기가 어렵습니다. 예를 들어 무질서한 처리가 있습니다. 자세한 내용은 답변을 참조하십시오.
13) Java에서 스레드를 정지시키는 방법?
Java는 풍부한 API를 제공하지만 스레드를 중지하기위한 API를 제공하지 않습니다. JDK 1.0은 원래 stop (), sultend () 및 resume ()과 같은 일부 제어 방법을 가지고 있었지만 잠재적 교착 상태 위협으로 인해 후속 JDK 버전으로 더 이상 사용되지 않았습니다. 그 후, Java API의 디자이너는 스레드를 중지하는 호환적이고 스레드 안전 방법을 제공하지 않았습니다. run () 또는 call () 메소드가 실행되면 스레드가 자동으로 종료됩니다. 스레드를 수동으로 종료하려면 휘발성 부울 변수를 사용하여 run () 메소드 루프를 종료하거나 스레드를 중단하기 위해 작업을 취소 할 수 있습니다. 샘플 코드를 보려면 여기를 클릭하십시오.
14) 스레드가 실행될 때 예외가 발생하면 어떻게됩니까?
이것은 인터뷰에서 발생한 매우 까다로운 Java 인터뷰 질문입니다. 간단히 말하면, 예외가 잡히지 않으면 스레드가 실행 중지됩니다.
Thread.uncaughtexceptionAndler는 갑작스런 스레드 인터럽트를 유발하는 예외를 처리하기위한 임베디드 인터페이스입니다. 끊임없는 예외로 인해 스레드가 방해가되면 JVM은 Thread.GetUncugexceptionHandler ()를 사용하여 스레드의 uncaughtexceptionHandler를 쿼리하고 처리를위한 핸들러의 uncaughtexception () 메소드로 스레드와 예외를 전달합니다.
15) 두 스레드간에 데이터를 공유하는 방법은 무엇입니까?
객체를 공유하여이를 수행하거나 차단 큐와 같은 동시 데이터 구조를 사용할 수 있습니다. 이 튜토리얼 인 "Java Inter-Shread Communication"(두 스레드간에 객체를 공유하는 것)은 대기 및 통지 방법을 사용하여 생산자 소비자 모델을 구현합니다.
16) Java의 Notify와 Notifyall의 차이점은 무엇입니까?
멀티 스레딩은 단일 모니터링 잠금을 기다릴 수 있고 Java API 설계자는 조건이 변경되기를 기다릴 때 알리는 몇 가지 방법을 제공하지만 이러한 방법은 완전히 구현되지 않기 때문에 이것은 또 다른 까다로운 문제입니다. Notify () 메소드는 특정 스레드를 깨울 수 없으므로 한 스레드가 대기 할 때만 작동합니다. 그리고 NotifyAll ()는 모든 스레드를 깨우고 잠금 장치에 대해 경쟁하여 적어도 하나의 스레드가 계속 실행될 수 있도록 허용합니다. 내 블로그에는 더 자세한 정보와 샘플 코드가 있습니다.
17) 왜 대기, 알림 및 알림 메소드가 스레드 클래스에 있지 않습니까?
이것은 기존 시스템에 대한 면접관의 인식과 공통적이지만 불합리한 것으로 보이는 설계 관련 질문입니다. 이러한 질문에 답할 때 이러한 방법을 객체 클래스에 넣는 것이 왜 합리적 인 이유를 설명해야하고,이를 스레드 클래스에 넣지 않겠습니까? 한 가지 명백한 이유는 Java가 제공하는 잠금 장치가 스레드 레벨이 아닌 객체 수준이기 때문에 각 객체에는 스레드를 통해 얻은 잠금 장치가 있기 때문입니다. 스레드가 일부 잠금을 기다려야하는 경우 객체에서 Wait () 메소드를 호출하는 것이 합리적입니다. 대기 () 메소드가 스레드 클래스에 정의되면 스레드가 대기중인 상태에서는 분명하지 않습니다. 간단히 말하면, 대기, 알림 및 알림은 잠금 수준 작업이므로 잠금이 객체에 속하므로 객체 클래스에 정의됩니다. 이 기사를 확인하여 자세한 내용을 알 수 있습니다.
18) ThreadLocal 변수는 무엇입니까?
ThreadLocal은 Java의 특수 변수입니다. 각 스레드에는 ThreadLocal이 있으므로 각 스레드에는 고유 한 독립 변수가 있고 레이스 조건이 완전히 제거됩니다. 고가의 물체를 만들기 위해 스레드 안전을 얻는 좋은 방법입니다. 예를 들어, 스레드 락을 사용하여 SimpledateFormat 스레드-안전을 만들 수 있습니다. 해당 클래스는 생성 비용이 많이 들고 각 호출마다 다른 인스턴스를 생성해야하므로 로컬로 사용하는 것이 좋습니다. 각 스레드에 고유 한 변수 사본을 제공하면 효율성이 크게 향상됩니다. 첫째, 생성 된 비싼 물체의 수는 다중화에 의해 줄어 듭니다. 둘째, 비용이 많이 드는 동기화 또는 불변을 사용하지 않고 스레드 안전을 얻습니다. 스레드 로컬 변수의 또 다른 좋은 예는 ThreadLocalrandom 클래스로, 다중 스레드 환경에서 생성 된 값 비싼 임의 객체의 수를 줄입니다. 자세한 내용은 답을 참조하십시오.
19) FutureTask 란 무엇입니까?
Java 동시 프로그램에서 Futuretask는 취소 할 수있는 비동기 작업을 나타냅니다. 작업 시작 및 취소, 작업 완료 여부 쿼리 및 작업 결과 검색과 같은 방법이 있습니다. 결과는 작업이 완료 될 때만 검색 할 수 있습니다. 작업이 완료되지 않은 경우 Get 메소드가 차단됩니다. FutureTask 객체는 호출 가능하고 달리기 쉬운 객체를 랩핑 할 수 있습니다. FutureTask는 또한 런닝 가능한 인터페이스를 호출하기 때문에 실행을 위해 집행자에게 제출할 수 있습니다.
20) Java에서 중단 된 방법과 중단 된 방법의 차이점은 무엇입니까?
Interrupted ()와 Islinterrupted ()의 주요 차이점은 전자가 인터럽트 상태를 지우는 반면 후자는 그렇지 않다는 것입니다. Java Multithreading의 인터럽트 메커니즘은 내부 식별자와 함께 구현됩니다. Thread.interrupt ()를 호출하여 스레드를 방해하면 인터럽트 식별자가 True로 설정됩니다. 인터럽트 스레드가 정적 메소드 스레드를 호출하여 인터럽트 상태를 확인하기 위해 인터럽트 상태를 확인하면 인터럽트 상태가 지워집니다. 비 정적 메소드는 인터럽트 상태 식별자를 변경하지 않고 다른 스레드의 인터럽트 상태를 쿼리하는 데 사용됩니다. 간단히 말해서, 중단 된 예고를 던지는 모든 방법은 인터럽트 상태가 지워집니다. 어쨌든 스레드의 인터럽트 상태는 인터럽트를 호출하는 다른 스레드에 의해 변경 될 수 있습니다.
21) 왜 대기 및 메소드를 동기 블록으로 호출해야합니까?
이는 주로 Java API가 이것을 강제하기 때문입니다. 그렇지 않은 경우 코드는 불법 모니터 스테이트 픽스레인 예외를 던집니다. 또 다른 이유는 대기와 통지 사이의 인종 조건을 피하는 것입니다.
22) 루프에서 대기 조건을 확인 해야하는 이유는 무엇입니까?
대기 상태의 스레드는 오류 경고와 의사가 깨어날 수 있습니다. 대기 조건이 루프에서 확인되지 않으면 최종 조건을 충족시키지 않고 프로그램이 종료됩니다. 따라서 대기 스레드가 깨어날 때 원래 대기 상태가 여전히 유효하다는 것을 고려할 수 없으며, Notify () 메소드 호출 후 및 대기 스레드가 깨어나기 전에이 기간 동안 변경 될 수 있습니다. 이것이 루프에서 Wait () 메소드를 사용하는 것이 더 잘 작동하는 이유입니다. Eclipse에서 템플릿을 만들어 대기를 호출하고 통지하고 시도해 볼 수 있습니다. 이 문제에 대해 더 많이 배우려면 "효과적인 Java"책의 스레딩 및 동기화 장을 읽는 것이 좋습니다.
23) Java의 동기 컬렉션과 동시 컬렉션의 차이점은 무엇입니까?
동기 컬렉션과 동시 컬렉션은 모두 멀티 스레딩 및 동시성에 적합한 스레드-안전 컬렉션을 제공하지만 동시 컬렉션은 더욱 확장 가능합니다. Java 1.5 이전에 프로그래머는 동기 컬렉션 만 사용했으며 다중 스레드 동시성이 기여할 때 경합으로 이어지고 시스템의 확장 성을 방해합니다. Java5는 ConsurenTashMap과 같은 동시 컬렉션을 소개합니다. ConsurenTashMap은 스레드 안전성을 제공 할뿐만 아니라 잠금 분리 및 내부 영역과 같은 최신 기술의 확장 성을 향상시킵니다. 자세한 내용은 답을 참조하십시오.
24) 자바의 힙과 스택의 차이점은 무엇입니까?
이 질문이 멀티 스레드 및 동시 인터뷰 질문으로 분류되는 이유는 무엇입니까? 스택은 스레드와 밀접한 관련이있는 메모리 영역이기 때문입니다. 각 스레드에는 자체 스택 메모리가 있으며 로컬 변수, 메소드 매개 변수 및 스택 호출을 저장하는 데 사용됩니다. 한 스레드에 저장된 변수는 다른 스레드에 보이지 않습니다. 힙은 모든 스레드가 공유하는 일반적인 메모리 영역입니다. 객체는 힙에 생성됩니다. 효율성을 향상시키기 위해 스레드는 힙에서 자체 스택으로 A를 캐시합니다. 여러 스레드 가이 변수를 사용하면 문제가 발생할 수 있습니다. 현재 휘발성 변수는 역할을 수행 할 수 있으며, 이는 스레드가 기본 메모리에서 변수의 값을 읽어야합니다.
자세한 내용은 답을 참조하십시오.
25) 스레드 풀이란 무엇입니까? 왜 그것을 사용합니까?
스레드를 만드는 데 비싼 자원과 시간이 걸립니다. 작업이 온 후에 만 스레드가 생성되면 응답 시간이 더 길어지고 프로세스가 제한된 수의 스레드를 생성 할 수 있습니다. 이러한 문제를 피하기 위해 프로그램이 시작될 때 응답하고 처리하기 위해 여러 스레드가 생성됩니다. 스레드 풀이라고하며 내부의 스레드를 작업자 스레드라고합니다. JDK1.5를 시작으로 Java API는 다른 스레드 풀을 만들 수있는 Executor 프레임 워크를 제공합니다. 예를 들어, 한 번에 하나의 작업을 처리하는 단일 스레드 풀; 고정 된 수의 스레드 풀 또는 캐시 스레드 풀 (짧은 작업이있는 많은 프로그램에 적합한 확장 실 풀). 자세한 내용은이 기사를 참조하십시오.
26) 생산자 및 소비자 문제를 해결하기 위해 코드를 작성하는 방법은 무엇입니까?
실제로, 당신이 해결하는 많은 스레드 문제는 생산자 소비자 모델에 속합니다. 즉, 하나의 스레드 생산 작업은 다른 스레드에 의한 소비입니다. 이 문제를 해결하기 위해 스레드간에 의사 소통하는 방법을 알아야합니다. 상대적으로 낮은 수준의 방법은 대기를 사용 하여이 문제를 해결하기 위해 통지하는 것입니다. 가장 우수한 방법은 세마포어 또는 블록 링크를 사용하여 생산자 및 소비자 모델을 구현하는 것입니다. 이 튜토리얼은 그것을 구현합니다.
27) 교착 상태를 피하는 방법?
Java Multithreading의 교착 상태
교착 상태는 자원 경쟁으로 인해 실행 프로세스 중 두 개 이상의 프로세스로 인한 상호 대기의 현상을 말합니다. 외부 세력이 없으면 계속할 수 없습니다. 교착 상태가 프로그램을 중단하고 작업을 완료 할 수 없기 때문에 이것은 심각한 문제입니다. 교착 상태 발생에 대해서는 다음 4 가지 조건을 충족해야합니다.
상호 제외 조건 : 자원은 한 번에 한 프로세스에서만 사용할 수 있습니다.
요청 및 보류 조건 : 자원 요청으로 인해 프로세스가 차단되면 획득 한 리소스를 유지합니다.
박탈 조건 : 프로세스에서 얻은 자원은 사용이 끝날 때까지 강제로 박탈 될 수 없습니다.
루프 대기 조건 : 머리와 꼬리에 연결된 여러 프로세스간에 루프 대기 자원 관계가 형성됩니다.
교착 상태를 피하는 가장 쉬운 방법은 루프 대기 조건을 방지하고, 플래그를 설정하고, 시스템의 모든 리소스를 정렬하고, 모든 프로세스 애플리케이션 리소스가 교착 상태를 피하기 위해 특정 순서 (오름차순 또는 내림차순)로 작동해야한다고 규정하는 것입니다. 이 튜토리얼에는 교착 상태를 피하는 것에 대한 코드 예제 및 토론 세부 사항이 있습니다.
28) 자바의 라이브 자물쇠와 교착 상태의 차이점은 무엇입니까?
이것은 이전 질문의 확장입니다. 라이브 자물쇠는 교착 상태와 유사합니다. 차이점은 라이브 잠금 장치의 실 또는 프로세스의 상태가 끊임없이 변화하고 있다는 것입니다. 라이브 자물쇠는 특별한 종류의 굶주림으로 간주 될 수 있습니다. 라이브 잠금 장치의 현실적인 예는 두 사람이 좁은 복도에서 만날 때입니다. 둘 다 서로를 피하려고 노력하여 서로를 통과 할 수 있지만, 회피의 방향이 동일하기 때문에 아무도 복도를 통과 할 수 없습니다. 간단히 말해서, 라이브 잠금 장치와 데드 잠금 장치의 주요 차이점은 이전 프로세스의 상태를 변경할 수 있지만 계속 실행할 수 없다는 것입니다.
29) 스레드에 잠금이 있는지 여부를 감지하는 방법은 무엇입니까?
전화 인터뷰에 참석할 때까지 스레드에 자물쇠가 있는지 실제로 감지 할 수 있다는 것을 결코 알지 못했습니다. java.lang.thread는 holdslock ()라는 메소드가 있으며, 현재 스레드가 특정 객체의 잠금 장치를 소유 한 경우에만 True를 반환합니다. 이 기사를 확인하여 자세한 내용을 알 수 있습니다.
30) Java에서 스레드 스택을 어떻게 얻습니까?
다른 운영 체제의 경우 Java 프로세스의 스레드 스택을 얻는 여러 가지 방법이 있습니다. 스레드 스택을 얻으면 JVM은 모든 스레드의 상태를 로그 파일에 저장하거나 콘솔에 출력합니다. Windows에서는 Ctrl + Break 키 조합을 사용하여 스레드 스택을 가져오고 Linux에서 Kill -3 명령을 사용할 수 있습니다. Jstack 도구를 사용하여 스레드 ID에서 작동하는 도구를 얻을 수 있으며 JPS 도구를 사용하여 ID를 찾을 수 있습니다.
31) JVM의 어떤 매개 변수는 작은 스택으로 스레드 스택을 제어하는 데 사용됩니다.
이 문제는 매우 간단합니다. -XSS 매개 변수는 스레드의 스택 크기를 제어하는 데 사용됩니다. 이 매개 변수에 대한 자세한 내용은 JVM 구성 목록을 볼 수 있습니다.
32) Java의 동기화와 재진입 락의 차이점은 무엇입니까?
Java는 동기화 된 키워드를 통해 오랫동안 상호 배제를 달성 할 수 있었으며 몇 가지 단점이 있습니다. 예를 들어, 잠금 장치 이외의 방법이나 블록 경계를 확장 할 수 없으며 잠금 장치를 획득하려고 할 때는 절반을 취소 할 수 없습니다. Java 5는 잠금 인터페이스를 통해 이러한 문제를 해결하기 위해 더 복잡한 컨트롤을 제공합니다. Reintrantlock 클래스는 동시에 동시성과 메모리 의미를 동기화하는 동시성과 메모리 의미를 갖는 잠금을 구현하며 확장 가능합니다. 이 기사를 확인하여 자세한 내용을 알 수 있습니다
33) 3 개의 스레드 T1, T2 및 T3이 있습니다. 그들이 순서대로 실행되는지 확인하는 방법은 무엇입니까?
스레드가 멀티 스레딩에서 특정 순서로 실행할 수있는 방법에는 여러 가지가 있습니다. 스레드 클래스의 join () 메소드를 사용하여 한 스레드에서 다른 스레드를 시작할 수 있고 다른 스레드는 실행을 계속하기 위해 스레드를 완성합니다. 세 개의 스레드의 순서를 보장하려면 마지막 스레드를 먼저 시작해야합니다 (T3은 T2를 호출하고 T2가 T1을 호출 함) T1이 먼저 완료되고 T3이 마지막으로 완료되도록해야합니다. 이 기사를 확인하여 자세한 내용을 알 수 있습니다.
34) 스레드 클래스에서 수율 방법의 기능은 무엇입니까?
수율 방법은 현재 실행중인 스레드 오브젝트를 일시 중지하고 우선 순위가 동일한 다른 스레드를 실행하도록 허용 할 수 있습니다. 정적 방법이며 현재 스레드가 CPU 사용량을 포기하고 다른 스레드가 CPU를 점유 할 수 있다고 보장 할 수는 없습니다. 수율을 실행하는 스레드 ()은 일시 정지 상태로 들어 오자 즉시 실행될 수 있습니다. 수율 방법에 대한 자세한 내용을 보려면 여기를 클릭하십시오.
35) Java에서 ConspernthashMap의 동시성은 무엇입니까?
ConsurenThashMap은 실제 맵을 여러 부분으로 나누어 확장 성과 스레드 안전성을 달성합니다. 이 부서는 동시성을 사용하여 얻어 진 ConcurrenThashMap 클래스 생성자의 선택적 매개 변수이며 기본값은 16이므로 다중 스레딩 상황에서 경합을 피할 수 있습니다. 더 많은 동시성과 내부 크기 조정을 보려면 내 기사를 읽으십시오.
36) 자바의 세마포어는 무엇입니까?
Java의 Semaphore는 새로운 동기화 클래스로 계산 신호입니다. 개념적으로 개념적으로 세마포어는 일련의 허가를 유지합니다. 필요한 경우 라이센스를 얻기 전에 라이센스를 사용할 수 있기 전에 각 accure ()가 차단됩니다. 각 릴리스 ()는 권한을 추가하여 차단 획득자를 해제 할 수 있습니다. 그러나 실제 라이센스 오브젝트를 사용하지 않고 세마포어는 사용 가능한 라이센스 번호 만 계산하고 해당 조치를 취합니다. 세마포어는 종종 데이터베이스 연결 풀과 같은 멀티 스레드 코드에서 사용됩니다. 자세한 내용은 여기를 클릭하십시오.
37) 작업을 제출하면 스레드 풀 큐가 가득 찼습니다. 그것이 일어날 때 어떻게됩니까?
이 질문은 교활하며 많은 프로그래머는 스레드 풀 큐에 공간이있을 때까지 작업이 차단 될 것이라고 생각할 것입니다. 실제로, 작업을 실행할 수없는 경우 ThreadPooleExecutor의 제출 () 메소드는 거부 executionException 예외를 던집니다.
38) Java 스레드 풀의 제출 ()와 execute () 메소드의 차이점은 무엇입니까?
두 방법 모두 작업을 스레드 풀에 제출할 수 있습니다. execute () 메소드의 리턴 유형은 void이며, 이는 Executor 인터페이스에 정의되어 있으며, 제출 () 메소드는 계산 결과를 보유한 미래의 객체를 반환 할 수 있습니다. ExecutorService 인터페이스에 정의됩니다. 실행자 인터페이스를 확장합니다. ThreadPooleExecutor 및 ScheduledThreadPooleExecutor와 같은 다른 스레드 풀 클래스에는 이러한 방법이 있습니다. 자세한 내용은 여기를 클릭하십시오.
39) 차단 방법은 무엇입니까?
차단 방법은 프로그램이 방법이 완료 될 때까지 대기하고 다른 작업을 수행하지 않음을 의미합니다. serversocket의 acccept () 메소드는 클라이언트가 연결되기를 기다리는 것입니다. 여기에서 차단하면 호출 결과가 반환되기 전에 현재 스레드가 중단되며 결과가 얻을 때까지 반환되지 않습니다. 또한 작업이 완료되기 전에 반환되는 비동기 및 비 차단 방법이 있습니다. 자세한 내용은 여기를 클릭하십시오.
40) 스윙 스레드-안전입니까? 왜?
긍정적 인 대답을 할 수 있고, 스윙은 스레드 안전이 아니지만, 면접관이 왜 그런지 묻지 않더라도이 답변이 왜이 대답인지 설명해야합니다. 스윙이 스레드 안전이 아니라고 말하면 종종 다중 스레드에서 수정할 수없는 구성 요소를 언급합니다. GUI 구성 요소에 대한 모든 업데이트는 AWT 스레드에서 완료해야합니다. Swing은 업데이트 할 두 가지 동기 및 비동기 콜백 방법을 제공합니다. 더 많은 스윙 및 스레드 안전 관련 콘텐츠를 보려면 여기를 클릭하십시오.
41) Java의 InvokeAndwait와 Invokelater의 차이점은 무엇입니까?
이 두 가지 방법은 이벤트 디스패치 스레드가 아닌 현재 스레드에서 GUI 구성 요소를 업데이트하기 위해 Swing API에서 Java 개발자가 제공합니다. InvokeAndwait ()는 진행률 표시 줄과 같은 GUI 구성 요소를 동기 업데이트합니다. 진행 상황이 업데이트되면 그에 따라 진행률 표시 줄도 변경해야합니다. 진행 상황이 여러 스레드에 의해 추적되면 invokeAndwait () 메소드가 호출되도록 이벤트 디스패치 스레드를 요청하여 구성 요소를 업데이트하도록 요청합니다. invokelater () 메소드는 구성 요소를 업데이트하기 위해 비동기 적으로 호출됩니다. 자세한 내용은 여기를 클릭하십시오.
42) 스윙 API의 스레드 안전 방법은 무엇입니까?
이 질문은 또한 스윙 및 스레드 안전성을 언급합니다. 구성 요소는 스레드 안전하지는 않지만 Repaint () 및 Revalidate ()와 같이 다중 스레드로 불릴 수있는 몇 가지 방법이 있습니다. jtextcomponent의 settext () 메소드 및 insert () 및 append () 메소드의 jtextArea도 스레드-안전입니다.
43) 자바에서 불변의 물체를 만드는 방법은 무엇입니까?
이 문제는 멀티 스레딩과 관련이 없지만 불변은 이미 복잡한 동시 프로그램을 단순화하는 데 도움이됩니다. 불변의 객체는 동기화없이 공유 할 수있어 객체에 동시에 액세스 할 때 동기화 오버 헤드가 줄어 듭니다. 그러나 Java에는 @immutable 주석이 없습니다. 불변의 클래스를 만들려면 다음 단계를 구현해야합니다. 우리는 다음 단계를 구현해야합니다. 생성자를 통해 모든 멤버를 초기화하고 변수에 세터 메소드를 제공하지 말고 모든 멤버를 개인으로 선언하여 이러한 구성원에게 직접 액세스 할 수 없도록하십시오. getter 방법에서는 객체 자체를 직접 반환하지 말고 객체를 복제하고 객체의 사본을 반환하십시오. Java에서 불변의 물체를 만드는 방법에 대한 내 기사에는 자세한 자습서가 있으며 읽은 후 자신감이 가득 할 수 있습니다.
44) Java의 ReadWritelock이란 무엇입니까?
일반적으로 읽기 및 쓰기 잠금 장치는 동시 프로그램의 성능을 향상시키는 데 사용되는 잠금 분리 기술의 결과입니다. Java의 ReadWritelock은 Java 5에 추가 된 새로운 인터페이스입니다. ReadWritelock은 한 쌍의 관련 잠금 장치, 하나는 읽기 전용 작업 및 쓰기 용을 유지합니다. 읽기 잠금은 쓰기 스레드없이 다중 읽기 스레드에 의해 유지 될 수 있습니다. Writ
45) 멀티 스레딩에서 바쁜 루프는 무엇입니까?
바쁜 루프는 프로그래머가 루프를 사용하여 스레드를 기다릴 때입니다. Wake (), sleep () 또는 수율 ()과 같은 기존 방법과 달리 모두 CPU 제어를 포기하지만 바쁜 루프는 CPU를 포기하지 않지만 빈 루프를 실행하고 있습니다. 이것의 목적은 CPU 캐시를 보존하는 것입니다. 멀티 코어 시스템에서는 스레드가 일어나기를 기다리는 하나는 다른 커널에서 실행될 수있어 캐시를 재건 할 수 있습니다. 캐시 재건을 피하고 재건을 기다리는 시간을 줄일 수 있습니다. 자세한 내용은이 기사에서 확인할 수 있습니다.
46) 휘발 변수와 원자 변수의 차이점은 무엇입니까?
이것은 흥미로운 질문입니다. 첫째, 휘발성 변수는 원자 변수와 매우 유사 해 보이지만 함수는 다릅니다. 휘발성 변수는 전임 관계를 보장합니다. 즉, 후속 읽기 작업 전에 쓰기 작업이 발생하지만 원자력을 보장하지는 않습니다. 예를 들어, 휘발성으로 카운트 변수를 수정하면 Count ++ 작업은 원자가 아닙니다. Atomicinteger 클래스가 제공하는 원자 메소드는이 작업이 원자를 만들 수 있습니다. 예를 들어, getAndIncrement () 메소드는 원자 증분 작업을 수행하여 현재 값을 하나씩 추가하고 기타 데이터 유형과 참조 변수도 유사한 작업을 수행 할 수 있습니다.
47) 동기화 블록 내의 스레드가 예외를 던지면 어떻게됩니까?
이 질문은 많은 Java 프로그래머를 속였습니다. 자물쇠 가이 단서를 풀어 줄지 여부를 생각할 수 있다면 여전히 올바르게 대답하기를 희망합니다. 동기화 블록이 정상적으로 또는 비정상적으로 종료 되든 내부의 스레드가 잠금을 해제하든 잠금 인터페이스와 비교하여 동기화 블록을 선호하기 때문에 잠금을 해제하는 데 에너지를 소비 할 필요가 없기 때문에 동기화 블록을 선호합니다. 이 기능은 최종 블록에서 잠금을 풀어서 구현할 수 있습니다.
48) 싱글 톤 모드의 더블 체크 잠금은 얼마입니까?
이 질문은 종종 Java 인터뷰에서 묻지 만, 면접관은이 질문에 대한 답변에 50%만이 만족합니다. 사람들의 절반은 더블 체크 잠금 장치를 쓸 수 없으며 절반의 사람들은 숨겨진 위험과 Java 1.5가 어떻게 수정했는지 말할 수 없습니다. 실제로 스레드 안전 싱글 톤을 만드는 것은 오래된 방법입니다. 싱글 톤 인스턴스가 처음 만들어지면 단일 잠금으로 성능을 최적화하려고 시도하지만 너무 복잡하기 때문에 JDK1.4에서 실패하고 개인적으로도 마음에 들지 않습니다. 어쨌든, 당신이 그것을 좋아하지 않더라도, 당신은 종종 그것이 자주 요청되기 때문에 그것을 이해해야합니다. 자세한 내용은 Singleton Works 기사에서 Double Checked Locking을 확인할 수 있습니다.
49) Java에서 스레드 안전 싱글 톤을 만드는 방법은 무엇입니까?
이것은 위의 질문에 대한 후속 조치입니다. 이중 점검 잠금 장치가 마음에 들지 않고 면접관이 싱글 톤 클래스를 만들기위한 대체 방법에 대해 질문 한 경우 JVM 클래스로드 및 정적 변수 초기화 기능을 사용하여 싱글 톤 인스턴스를 만들거나 열거 형식을 사용하여 싱글 톤을 만듭니다. 나는이 방법을 좋아한다. 자세한 내용은이 기사에서 확인할 수 있습니다.
50) 3 가지 멀티 스레딩 모범 사례를 작성하십시오
나는 이런 종류의 문제를 가장 좋아하며, 성과를 향상시키기 위해 동시 코드를 작성할 때 특정 모범 사례를 따를 것이라고 생각합니다. 다음은 대부분의 Java 프로그래머가 따라야한다고 생각하는 세 가지 모범 사례입니다.
당신의 스레드에 의미있는 이름을 부여하십시오.
이를 통해 버그를 쉽게 찾거나 추적 할 수 있습니다. OrderProcessor, quoteprocessor 또는 tradeprocessor이 이름은 Thread-1보다 훨씬 낫습니다. 스레드 -2 및 스레드 -3. 스레드에 완료하려는 작업과 관련된 이름을 부여하십시오. 모든 주요 프레임 워크와 JDK 조차도이 모범 사례를 따릅니다.
동기화 범위를 잠그고 좁히지 마십시오
자물쇠는 비싸고 컨텍스트 스위칭은 더 많은 시간이 소요됩니다. 중요한 영역을 최소화하기 위해 동기화 및 잠금 장치를 사용해보십시오. 따라서 동기화 방법보다 동기화 블록을 선호하므로 잠금을 절대적으로 제어 할 수 있습니다.
더 많은 동기화 클래스를 사용하고 덜 대기 및 알림을 사용하십시오.
먼저, CountdownLatch, Semaphore, Cyclicbarrier 및 Exchonganger 동기 클래스는 코딩 작업을 단순화하는 반면 대기 및 알림으로 복잡한 제어 흐름을 제어하기가 어렵습니다. 둘째,이 클래스는 최고의 기업이 작성하고 유지 관리합니다. 그들은 후속 JDK에서 계속 최적화되고 개선 될 것입니다. 이러한 상위 수준의 동기화 도구를 사용하면 프로그램을 최적화하지 않고 최적화 할 수 있습니다.
더 많은 동시 세트와 덜 동기화 된 세트를 사용하십시오. 이것은 팔로우하기 쉬운 또 다른 모범 사례입니다. 동시 세트는 동기화 된 세트보다 확장 가능하므로 동시 세트를 사용하는 것이 동시 프로그래밍에 더 좋습니다. 다음에 맵을 사용해야하는 경우 먼저 ConcurrEthashMap을 사용해야한다고 생각해야합니다. 내 기사 Java 동시 컬렉션에는 더 자세한 설명이 있습니다.
51) 스레드의 시작을 강제하는 방법?
이 문제는 Java Garbage Collection을 강제하는 방법과 같습니다. 아직 할 수있는 방법이 없습니다. System.gc ()를 사용하여 쓰레기 수집을 수행 할 수는 있지만 성공할 수는 없습니다. 스레드를 Java에서 시작하도록 강요하는 방법은 없으며 스레드 스케줄러에 의해 제어되며 Java는 관련 API를 게시하지 않습니다.
52) Java의 Fork Join Framework는 무엇입니까?
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。