이 기사를 사용하면 향후 발생하는 문제에 해당하도록 Java Multithreading의 기본 지식을 마스터하는 데 도움이됩니다. 특정 내용은 다음과 같습니다
1. Java 다중 스레드 인터뷰 질문
1. 프로세스와 스레드의 차이점은 무엇입니까?
프로세스는 자체 포함 된 실행 환경으로 프로그램이나 응용 프로그램으로 간주 될 수 있습니다. 스레드는 프로세스에서 실행되는 작업입니다. Java 런타임 환경은 다른 클래스와 프로그램을 포함하는 단일 프로세스입니다. 스레드를 경량 프로세스라고 할 수 있습니다. 스레드는 프로세스에서 생성 및 거주하기 위해 더 적은 리소스가 필요하며 프로세스에서 리소스를 공유 할 수 있습니다.
2. 멀티 스레드 프로그래밍의 이점은 무엇입니까?
멀티 스레드 프로그램에서는 프로그램의 효율성을 향상시키기 위해 여러 스레드가 동시에 실행되며 CPU는 특정 스레드가 리소스를 기다려야하므로 유휴 상태에 들어 가지 않습니다. 여러 스레드는 힙 메모리를 공유하므로 일부 작업을 수행하기 위해 여러 스레드를 작성하는 것이 여러 프로세스를 만드는 것보다 낫습니다. 예를 들어 서블릿은 Multithreading을 지원하는 반면 CGI는 그렇지 않기 때문에 서블릿은 CGI보다 낫습니다.
3. 사용자 스레드와 데몬 스레드의 차이점은 무엇입니까?
Java 프로그램에서 스레드를 만들 때 사용자 스레드라고합니다. 데몬 스레드는 백그라운드에서 실행되며 JVM이 종료되지 않는 스레드입니다. 사용자 스레드가 실행되지 않으면 JVM은 프로그램을 닫고 종료합니다. 데몬 스레드로 만든 자식 스레드는 여전히 데몬 스레드입니다.
4. 우리는 어떻게 스레드를 만드는가?
스레드를 생성하는 두 가지 방법이 있습니다. 하나는 런닝 가능한 인터페이스를 구현 한 다음 스레드 생성자로 전달하고 스레드 객체를 만드는 것입니다. 다른 하나는 스레드 클래스를 직접 상속하는 것입니다. 자세한 내용은 Java에서 스레드를 만드는 방법에 대한이 기사를 읽을 수 있습니다.
5. 다른 스레드 수명주기는 무엇입니까?
Java 프로그램에서 새 스레드를 만들 때 그 상태는 새로운 것입니다. 스레드의 start () 메소드를 호출하면 상태가 실행 가능하도록 변경됩니다. 스레드 스케줄러는 런닝 가능한 스레드 풀의 스레드에 CPU 시간을 할당하고 상태를 실행 중으로 변경합니다. 다른 스레드 상태로는 대기, 차단 및 죽음이 포함됩니다. 스레드 라이프 사이클에 대해 자세히 알아 보려면이 기사를 읽으십시오.
6. 스레드 클래스의 run () 메소드를 직접 호출 할 수 있습니까?
물론, 우리가 Thread의 run () 메소드를 호출하면 일반 메소드와 동일하게 작동합니다. 새 스레드에서 코드를 실행하려면 Thread.Start () 메소드를 사용해야합니다.
7. 일정 시간 동안 실행 스레드를 일시 중지하는 방법은 무엇입니까?
스레드 클래스의 수면 () 메소드를 사용하여 스레드를 일정 시간 동안 일시 중지 할 수 있습니다. 이것은 스레드가 끝나지 않는다는 점에 유의해야합니다. 실이 최대 절전 모드에서 깨어나면 스레드의 상태가 실행 가능하게 변경되며 스레드 스케줄링에 따라 실행됩니다.
8. 스레드 우선 순위에 대한 귀하의 이해는 무엇입니까?
각 스레드는 우선 순위가 있습니다. 일반적으로 고위급 스레드는 실행할 때 우선 순위가 우선하지만 이는 운영 체제 (OS 종속)와 관련된 스레드 스케줄링 구현에 따라 다릅니다. 스레드의 우선 순위를 정의 할 수 있지만, 우선 순위가 높은 스레드가 우선 순위가 낮은 스레드 앞에서 실행 될 것이라고 보장하지는 않습니다. 스레드 우선 순위는 int 변수 (1-10)이고 1은 최우선 순위를 나타내고 10은 가장 높은 우선 순위를 나타냅니다.
9. 스레드 스케줄러와 시간 슬라이싱이란 무엇입니까?
스레드 스케줄러는 CPU 시간을 실행 가능한 상태에서 스레드에 할당하는 운영 체제 서비스입니다. 스레드를 생성하고 시작하면 실행은 스레드 스케줄러의 구현에 따라 다릅니다. Time Sharding은 사용 가능한 CPU 시간을 사용 가능한 실행 가능한 스레드에 할당하는 프로세스를 나타냅니다. 할당 된 CPU 시간은 스레드 우선 순위 또는 스레드 대기 시간을 기반으로 할 수 있습니다. 스레드 스케줄링은 Java 가상 머신에 의해 제어되지 않으므로 응용 프로그램에 의해이를 제어하는 것이 좋습니다 (즉, 프로그램이 스레드 우선 순위에 의존하지 않도록하십시오).
10. 멀티 스레딩에서 컨텍스트 전환 란 무엇입니까?
Context Switching은 CPU 상태를 저장 및 복원하는 프로세스로 스레드 실행이 인터럽트 지점에서 실행을 재개 할 수있게합니다. 컨텍스트 스위칭은 멀티 태스킹 운영 체제 및 다중 스레드 환경의 기본 기능입니다.
11. Main () 메소드가 위치한 스레드가 Java 프로그램에서 끝나는 마지막 스레드인지 어떻게 확인합니까?
스레드 클래스의 조인트 () 메소드를 사용하여 프로그램에서 생성 된 모든 스레드가 Main () 메소드가 종료되기 전에 끝나도록 할 수 있습니다. 다음은 스레드 클래스의 관절 () 메소드에 관한 기사입니다.
12. 스레드는 어떻게 전달됩니까?
스레드 간 리소스를 공유 할 수있는 경우, 스레드 간 커뮤니케이션은이를 조정하는 중요한 수단입니다. 객체 클래스의 대기 ()/notify ()/notifyall () 메소드를 사용하여 리소스에 대한 잠금 상태에 대한 스레드간에 통신 할 수 있습니다. Thread Wait, Notify 및 Notifyall에 대한 자세한 내용을 보려면 여기를 클릭하십시오.
13. 스레드 커뮤니케이션 메소드가 Wait (), notify () 및 notifyall ()가 객체 클래스에 정의 된 이유는 무엇입니까?
Java의 각 객체에는 잠금 (모니터, 모니터 일 수있는 모니터) 및 Wait (), notify ()가 있으며 다른 방법은 객체의 잠금을 기다리거나 다른 스레드 개체를 사용할 수 있도록 알리는 데 사용됩니다. Java 스레드에서 사용하는 데 사용할 수있는 잠금 장치 및 동기화기가 없습니다. 이것이 이러한 방법이 객체 클래스의 일부인 이유이므로 Java의 모든 클래스는 스레드 간 커뮤니케이션을위한 기본 방법을 갖습니다.
14. 왜 (), notify () 및 notifyall ()가 동기화 메소드 또는 동기화 블록에서 호출 해야하는 이유는 무엇입니까?
스레드가 객체의 Wait () 메소드를 호출 해야하는 경우 스레드에 객체의 잠금이 있어야합니다. 그런 다음 객체의 잠금을 출시하고 다른 스레드가 객체에서 notify () 메소드를 호출 할 때까지 대기 상태로 들어갑니다. 마찬가지로 스레드가 객체의 Notify () 메소드를 호출해야 할 때 다른 스레드가 객체의 잠금을 가져 오기 위해 대기 할 수 있도록 객체의 잠금을 해제합니다. 이러한 모든 방법에는 스레드가 객체의 잠금을 고정해야하므로 동기화를 통해서만 구현할 수 있으므로 동기화 메소드 또는 동기화 블록에서만 호출 할 수 있습니다.
15. 스레드 클래스의 수면 () 및 수율 () 방법이 왜 정적입니까?
스레드 클래스의 수면 () 및 수율 () 메소드는 현재 실행중인 스레드에서 실행됩니다. 따라서 대기 상태에있는 다른 스레드에서 이러한 방법을 호출하는 것은 의미가 없습니다. 이것이 이러한 방법이 정적 인 이유입니다. 그들은 현재 실행중인 스레드에서 작업 할 수 있으며 이러한 방법을 다른 비 운영 스레드에서 호출 할 수 있다는 프로그래머의 잘못된 믿음을 피할 수 있습니다.
16. 스레드 안전을 보장하는 방법은 무엇입니까?
Java의 스레드 안전성을 보장하는 방법에는 여러 가지가 있습니다. 동기화, 원자 동시 클래스 사용, 동시 잠금 장치 구현, 휘발성 키워드 사용, 불변 클래스 및 스레드 안전 클래스를 사용합니다. 스레드 안전 튜토리얼에서 더 많은 것을 배울 수 있습니다.
17. Java에서 휘발성 키워드의 역할은 무엇입니까?
휘발성 키워드를 사용하여 변수를 수정하면 스레드가 변수를 직접 읽고 캐시하지 않습니다. 이를 통해 스레드가 읽은 변수가 메모리에서 일관되게됩니다.
18. 더 나은 선택, 동기화 방법 또는 동기화 블록은 무엇입니까?
동기식 블록은 전체 객체를 잠그지 않기 때문에 더 나은 선택입니다 (물론 전체 객체를 잠글 수 있습니다). 동기화 메소드는 클래스에 여러 개의 관련이없는 동기화 블록이 있더라도 전체 객체를 잠그므로 일반적으로 실행을 중단하고 객체의 잠금을 얻기 위해 기다려야합니다.
19. 데몬 스레드를 만드는 방법?
스레드 클래스의 SetDaemon (True) 메소드를 SetDaemon (True) 메소드에 사용하여 스레드를 데몬 스레드로 설정하십시오. start () 메소드를 호출하기 전에이 메소드를 호출해야한다는 점에 유의해야합니다.
20. ThreadLocal이란 무엇입니까?
ThreadLocal은 스레드의 로컬 변수를 만드는 데 사용됩니다. 우리는 객체의 모든 스레드가 전역 변수를 공유 할 것이므로 이러한 변수는 스레드 안전하지 않으며 동기화 기술을 사용할 수 있습니다. 그러나 동기화를 사용하고 싶지 않을 때는 ThreadLocal 변수를 선택할 수 있습니다.
각 스레드에는 자체 스레드 변수가 있으며 Get ()/set () 메소드를 사용하여 기본값을 얻거나 내부적으로 값을 변경할 수 있습니다. ThreadLocal 인스턴스는 일반적으로 개인 정적 속성으로 스레드 상태와 연관되기를 원합니다. 이 기사에서는 ThreadLocal에 대한 작은 프로그램을 볼 수 있습니다.
21. 스레드 그룹이란 무엇입니까? 권장하지 않는 이유는 무엇입니까?
ThreadGroup은 스레드 그룹에 대한 정보를 제공하는 목적의 클래스입니다.
ThreadGroup API는 상대적으로 약하며 스레드보다 더 많은 기능을 제공하지 않습니다. 두 가지 주요 기능이 있습니다. 하나는 스레드 그룹에서 활성 스레드 목록을 얻는 것입니다. 다른 하나는 스레드에 대한 예외 핸들러를 설정하는 것입니다. 그러나 Java 1.5에서 스레드 클래스는 SetuncaughtexceptionHandler (uncaughtexceptionHandler eh) 메소드를 추가하여 스레드 그룹의 구식이되었으며 계속 사용하지 않는 것이 좋습니다.
t1.setuncugexceptionHandler (new uncaughtexceptionHandler () {@override public void uncaughtexception (스레드 t, Throwable e) {system.out.println ( "예외가 발생했습니다 :"+e.getMessage ()); 22. Java 스레드 덤프 란 무엇이며 얻는 방법은 무엇입니까?
스레드 덤프는 시스템 병목 현상 및 교착 상태 분석에 매우 유용한 JVM 활성 스레드 목록입니다. Profiler, Kill -3 Command, Jstack 도구 등을 사용하는 스레드 덤프를 얻는 방법에는 여러 가지가 있습니다. 사용하기 쉽고 JDK와 함께 제공되므로 Jstack 도구를 선호합니다. 터미널 기반 도구이므로 분석을 위해 스레드 덤프를 적시에 생성하기 위해 일부 스크립트를 작성할 수 있습니다. 스레드 덤프 생성에 대해 자세히 알아 보려면이 문서를 읽으십시오.
23. 교착 상태 란 무엇입니까? 교착 상태를 분석하고 피하는 방법?
교착 상태는 두 개의 스레드가 영원히 차단되는 상황을 말합니다. 이 상황에는 적어도 두 개의 스레드와 2 개 이상의 리소스가 필요합니다.
교착 상태를 분석하려면 Java 응용 프로그램의 스레드 덤프를보아야합니다. 상태가 차단 된 스레드와 그들이 기다리고있는 자원을 찾아야합니다. 각 리소스에는 고유 한 ID가 있습니다. 이 ID를 사용하여 이미 객체 잠금 장치가있는 스레드를 찾을 수 있습니다.
중첩 잠금 장치를 피하고 필요한 곳에 잠금 만 사용하고 무기한 대기를 피하는 것은 교착 상태를 피하는 일반적인 방법이며,이 기사를 읽으려면 교착 상태를 분석하는 방법을 배우십시오.
24. Java 타이머 클래스는 무엇입니까? 특정 시간 간격으로 작업을 만드는 방법은 무엇입니까?
java.util.timer는 앞으로 특정 시간에 실행할 스레드를 예약하는 데 사용할 수있는 도구 클래스입니다. 타이머 클래스는 일회성 작업 또는주기적인 작업을 예약하여 정리할 수 있습니다.
java.util.timertask는 런닝 가능한 인터페이스를 구현하는 추상 클래스입니다. 우리는 자신의 시간이 정해진 작업을 만들고 타이머를 사용하여 실행을 준비하려면이 클래스를 상속해야합니다.
25. 스레드 풀이란 무엇입니까? 자바 스레드 풀을 만드는 방법?
스레드 풀은 일련의 작업자 스레드를 관리하며 실행 대기 대기 작업을 배치하기위한 대기열도 포함되어 있습니다.
java.util.concurrent.executors는 스레드 풀 생성을위한 java.util.concurrent.executor 인터페이스의 구현을 제공합니다. 스레드 풀 예제는 스레드 풀을 생성하고 사용하는 방법을 보여 주거나 ScheduledThreadPooleExecutor 예제를 읽으려면 주기적 작업을 작성하는 방법을 배웁니다.
2. Java 동시 인터뷰 질문
1. 원자 작동이란 무엇입니까? Java Concurrency API에는 어떤 원자 클래스가 있습니까?
원자 작동은 다른 작업의 영향을받지 않는 작업 작업 장치를 나타냅니다. 원자 운영은 다중 스레드 환경에서 데이터 불일치를 피하기 위해 필요한 수단입니다.
int ++는 원자 연산이 아니므로 스레드가 값을 읽고 1을 추가하면 다른 스레드가 이전 값을 읽을 수 있으므로 오류가 발생할 수 있습니다.
이 문제를 해결하려면 추가 작업이 원자인지 확인해야하며 JDK1.5 전에 동기화 기술을 사용하여이를 수행 할 수 있습니다. jdk1.5에서 java.util.concurrent.atomic 패키지는 int 및 긴 유형의 로딩 클래스를 제공하며, 이는 자동으로 작업에 원자력을 보장하고 동기화가 필요하지 않도록 할 수 있습니다.
2. Java 동시성 API의 잠금 인터페이스는 무엇입니까? 동기화 비교의 장점은 무엇입니까?
잠금 인터페이스는 동기화 방법 및 동기화 블록보다 더 확장 가능한 잠금 작동을 제공합니다. 보다 유연한 구조를 허용하고, 완전히 다른 특성을 가질 수 있으며, 여러 관련 클래스의 조건부 객체를 지원할 수 있습니다.
장점은 다음과 같습니다.
자물쇠를 더 공정하게 만들 수 있으므로 스레드가 잠금을 기다리는 동안 인터럽트에 응답하여 스레드가 잠금을 획득하려고 시도하고 잠금 장치를 얻거나 일정 시간을 기다릴 수 없을 때 즉시 반환 할 수 있습니다.
3. 집행자 프레임 워크는 무엇입니까?
Executor 프레임 워크는 Java 5에서 java.util.concurrent.executor 인터페이스와 함께 소개됩니다. 집행자 프레임 워크는 정책 세트에 따라 정책 호출, 일정, 실행 및 제어를 실행하는 비동기 작업을 실행하는 프레임 워크입니다.
무제한 생성 스레드는 애플리케이션 메모리 오버플로를 유발할 수 있습니다. 따라서 스레드 수를 제한 할 수 있고 스레드 수를 재활용하고 재사용 할 수 있기 때문에 스레드 풀을 만드는 것이 더 나은 솔루션입니다. Executors 프레임 워크를 사용하면 스레드 풀을 쉽게 만들 수 있습니다. 실행자 프레임 워크를 사용하여 스레드 풀을 만드는 방법을 배우려면이 기사를 읽으십시오.
4. 차단 대기열이란 무엇입니까? 차단 대기열을 사용하여 생산자 소비자 모델을 구현하는 방법은 무엇입니까?
java.util.concurrent.blockingqueue의 특징은 다음과 같습니다. 대기열이 비어 있으면 대기열에서 요소를 얻거나 삭제하는 작업이 차단되거나 큐가 가득 차면 큐에 요소를 추가하는 작업이 차단됩니다.
차단 대기열은 널 값을 허용하지 않으며 큐에 널 값을 추가하려고 할 때는 NullPointerException이 발생합니다.
차단 큐의 구현은 스레드 안전이며 모든 쿼리 방법은 원자이며 내부 잠금 장치 또는 기타 형태의 동시 제어를 사용합니다.
Blockingqueue 인터페이스는 Java Collections 프레임 워크의 일부이며 주로 생산자 소비자 문제를 구현하는 데 사용됩니다.
5. 부름과 미래는 무엇입니까?
Java 5는 동시성 패키지에 java.util.concurrent.callable 인터페이스를 소개합니다. 실행 가능한 인터페이스와 매우 유사하지만 객체를 반환하거나 예외를 던질 수 있습니다.
Callable 인터페이스는 제네릭을 사용하여 리턴 유형을 정의합니다. Executors 클래스는 스레드 풀에서 호출 가능한 작업을 실행하는 유용한 방법을 제공합니다. 호출 가능한 작업이 평행하므로 결과가 반환 될 때까지 기다려야합니다. java.util.concurrent.future 객체는이 문제를 해결합니다. 스레드 풀이 호출 가능한 작업을 제출 한 후 미래의 객체가 반환됩니다. 그것을 사용하여, 우리는 호출 가능한 작업의 상태를 알고 호출 가능에 의해 실행 결과를 반환 할 수 있습니다. Future는 호출 가능이 종료되고 실행 결과를 얻을 때까지 기다릴 수있는 get () 메소드를 제공합니다.
6. Futuretask 란 무엇입니까?
FutureTask는 미래의 기본 구현이며, 우리는 실행자와 함께 사용하여 비동기 작업을 처리 할 수 있습니다. 일반적으로 FutureTask 클래스를 사용할 필요가 없으며 향후 인터페이스의 일부 방법을 다시 작성하고 원래 기본 구현을 유지하려고 할 때 매우 유용합니다. 우리는 그것으로부터 물려 받고 필요한 방법을 다시 작성할 수 있습니다.
7. 동시 용기의 구현은 무엇입니까?
Java Collection 클래스는 모두 빠르게 실패하므로 세트가 변경되고 스레드가 Ierator를 사용하여 세트를 통과 할 때 Ierator의 다음 () 메소드는 동시 변형 정보 예외를 던집니다.
동시 컨테이너는 동시 트래버스 및 동시 업데이트를 지원합니다.
메인 클래스는 ConsurenTashMap, CopyonWriteAreRaylist 및 LoveOnWriteArrayset입니다. 동시 모형화를 피하는 방법을 배우려면이 기사를 읽으십시오.
8. 집행자 클래스는 무엇입니까?
Executors는 Executor, ExecutorService, ScheduleDexecutorService, ThreadFactory 및 Callable 클래스를위한 몇 가지 툴링 방법을 제공합니다.
실행자는 스레드 풀을 편리하게 만드는 데 사용될 수 있습니다.
실제로, 더 많은 기본 Java 인터뷰 질문이 있으며,이를 체계적으로 구성 할 수 있습니다.
인터뷰에서 모두가 성공하기를 바랍니다!