(A) (25) Thread 클래스 관련 면접 질문 및 답변 : 자바 인터뷰 하이라이트

자바 인터뷰 하이라이트 : 25 Thread 클래스 관련 인터뷰 질문과 대답 (A) .PNG

1. 어떤 스레드는? 어떤 과정인가? 둘의 차이 및 연락처는 무엇입니까?

(1) 스레드가 CPU의 기본 단위는 독립적으로 동작하며 별도 계획 (2) 프로세스가 자원 할당의 기본 단위이며, 두 애플리케이션이 링크가 수행된다 : 프로세스와 스레드가 운영 체제 프로그램 실행을 실행 베이스 유닛.

차이 : (1) 분리 된 주소 공간을 처리하는 프로세스가 충돌 한 후에, 보호 모드에서 다른 프로세스에 영향을 미칠 수 없다. 처리 단지 상이한 실행 경로 (2)의 스레드는 스레드 자신의 스택 및 로컬 변수를 가지지 만, 스레드 간의 별도의 주소 공간은 금형에 나사가 전체 과정 다이 동등하지있다.

프로세스는 응용 프로그램을 실행하고, 스레드는 프로세스 내의 실행의 시퀀스이다. 프로세스는 여러 개의 스레드를 가질 수 있습니다. 또한라는 경량 프로세스 스레드.

각 프로세스 스레드와의 차이점과 단점은 무엇인가 2.?

프로세스는 자원 할당의 최소 단위이며, 스레드는 프로그램 실행의 최소 단위이다.

프로세스는 별도의 주소 공간을 가지고, 각각의 프로세스를 시작, 코드 세그먼트, 스택 및 데이터 세그먼트를 유지하기 위해 데이터 테이블을 설정 그것을 위해 주소 공간을 할당 할 시스템은,이 작업은 매우 비싸다. 스레드 오버 프로세스보다 훨씬 작다 만드는 동안 프로세스보다 CPU 변화가 훨씬 작은 스레드를 취하므로 스레드는 동일한 주소 공간을 사용하여, 공유 된 데이터를 처리한다.

스레드 간의 더 편리한 통신 방식 (IPC) 통신 수행 과정과 동일한 과정 공유 전역 변수, 정적 변수 및 기타 데이터 통신에서 쓰레드. 하지만 어떻게 동기화를 처리하고 상호 배제는 멀티 스레드 프로그램을 작성의 어려움입니다 수 있습니다.

그러나 긴 스레드 다이가있는만큼 프로그램보다 강력한 멀티 프로세스, 멀티 스레드 프로그램, 전체 프로세스도, 죽은, 그 과정 자체 별도의 주소 공간을 가지고 있기 때문에 프로세스, 프로세스에 영향을주지 않습니다 다른 죽는다.

기사를 참조하십시오

여러 가지 방법으로 스레드를 생성합니다? 당신은 어느 것을 선호합니까? 이유는 무엇입니까?

스레드를 만들 수있는 세 가지 방법이 있습니다 :

상속 Thread클래스

구현 Runnable인터페이스

응용 프로그램은 스레드 풀을 생성하는 프레임 워크를 사용할 수 있습니다 집행자

구현 Runnable接口이 상속 할 필요가 없기 때문에이 방법이 더 인기가 Thread클래스를. 애플리케이션 설계의 경우 우리는 (그러나 자바는 다중 상속을 지원하지 않습니다)에만 인터페이스를 다중 상속을 필요로하는 다른 객체를 상속했다. 동시에, 스레드 풀도 매우 효율적으로 구현하고 사용하기 쉽습니다.

스레드 해석 4. 여러 가지 가능한 상태를 설명?

구현 프로세스의 스레드는 여러 주에서 다음을 할 수 있습니다 :

준비 (의 Runnable) : 스레드를 실행할 준비가 반드시 즉시 실행을 시작할 수 있습니다.

실행 (실행) : 스레드 코드 실행 과정을.

대기 중 (대기) : 처리 스레드 외측 단부 대기 차단된다.

잠 (수면) : 스레드가 잠을 강제로.

I / O는 (차단 ON I / O) 차단 된 I / O 작업이 완료 될 때까지 기다립니다을 :.

(동기화 차단) 동기 차단 : 락의 취득을 대기.

죽음 (죽은) : 스레드가 실행을 완료합니다.

5. 어떤 차이 동기화 방법 및 동기화 블록은?

자바 언어에서 각 개체는 잠금 장치가 있습니다. 스레드 객체에 대한 잠금을 얻기 위해 동기화 키워드를 사용할 수 있습니다. 동기화 된 키워드를 프로세스 레벨 (대단위 잠금) 또는 코드 블록 레벨 (세밀한 잠금)에 적용될 수있다.

키워드 Java 언어,이 방법 또는 시간의 블록을 수정하는 데 사용하는 경우, 최대 하나 개의 스레드가 같은 기간의 코드를 실행하는 것을 보장합니다.

두 동시 스레드 동일한 대상물이 동기 (이) 동기화 블록, 오직 하나의 스레드가 구현되는 시간에 액세스하기 (1). 현재 스레드는 코드 블록의 실행의 완료 이후에 코드 블록을 실행하는 다른 스레드 기다려야한다.

(2) 그러나, 액세스 스레드 동기화 (이) 동기화 블록의 목적은, 다른 스레드가 여전히 비 동기화 (이) 동기 블록 내의 오브젝트에 액세스 할 수있을 때.

스레드 동기화 (이) 동기화 블록의 오브젝트에 액세스하는 경우 (3), 특히 중요하다 동기 부호 블록에 액세스 할 수있는 동기화 된 다른 모든 스레드의 다른 목적은 (이)가 차단된다.

(4)는 동일한 제 동기 블록의 다른 실시 예에 적용된다. 즉, 하나의 스레드 동기화 객체에 액세스 할 때 (이) 동기화 블록은, 상기 오브젝트 잠금이 객체를 획득. 그 결과, 다른 스레드가 개체 동기화 코드 섹션의 모든 개체에 액세스하는 것은 일시적으로 차단되었습니다.

(5) 상기 규칙이 다른 목적 잠금 적용된다.

내부 모니터 (모니터) 6. 어떻게 스레드 동기화를합니까? 프로그램은 동기화의 수준을해야합니까?

Java 가상 머신 모니터 및 잠금 사용의 조각입니다. 그 하나의 스레드 만이 동기 블록을 실행하고 있도록, 모니터에게 동기 블록 모니터. 모니터 각각 오브젝트 참조와 연관된. 스레드가 잠금을 획득하기 전에 동기화 코드를 수행 할 수 없습니다.

7. 교착 상태 (교착 상태) 란 무엇입니까?

교착 상태가 발생 아래로 계속 완료되면 두 프로세스는 서로를 기다리고 있습니다. 결과는 두 프로세스가 무한 대기에 잡힌 것입니다.

교착 상태에 이르는 않으면 서 8. 어떻게 N N 스레드가 리소스에 액세스 할 수 있도록하려면?

지정 잠금의 인수의 순서, 강제 지정된 순서로 잠금 스레드를 획득 : 다중 스레드를 사용하는 경우, 피할 교착 상태에 매우 간단한 방법입니다. 모든 스레드가 로크와 같은 순서로 잠금을 해제하는 경우 이와 같이, 그것을 나타 교착 않는다.

9. 어떻게 교착 상태를 피하기 위해?

멀티 스레드 교착 개의 필요 조건 다음 상호 배타적 조건 : 자원은 프로세스에 의해 사용될 수있다. 그리고 요청은 조건을 유지하기 : 자원에 대한 자원 처리에 의한 요청 및 차단 된 액세스를 긴밀하게 유지되고 그 때. 양도 할 수없는 조정 : 프로세스가 완료되기 전에 사용하지 않는 자원에 액세스 할 수 있습니다, 그것은 부정 할 수 없다. 루프 대기 상태 : 자원을 기다리는 여러 프로세스간에 꼬리 순환 관계에 머리를 형성한다.

긴 이러한 조건의 파괴와 같은, 당신은 루프 조건 대기의 고리를 끊어야하는 간단한있는 교착 상태를 피할 수 있습니다. 객체,로드 록에 액세스 할 수있는 같은 순서로 잠금을 해제.

10. Thread 클래스의 시작 ()와 run () 메소드의 차이점은 무엇입니까?

시작 () 메소드는 생성 된 스레드는 실행 가능한 상태가되도록하는 것이, 새로운 스레드가 생성 시작하는 데 사용된다. 당신이 run () 메소드는 원래의 스레드에서 호출됩니다 호출 할 때, 새로운 스레드가 시작 () 메소드는 새로운 스레드를 시작합니다 시작되지 않습니다. 우리가 스레드의 run () 메소드를 호출 할 경우, 직접 실행 () 메소드를 실행 보통 같은 방식으로 행동 할 것이다. 새 스레드에서 우리의 코드를 실행하려면 Thread.start () 메소드를 사용해야합니다.

(11)의 Runnable에서 Java 및 호출 가능 차이점은 무엇입니까?

실행 가능한 및 호출 가능는 이러한 작업이 다른 스레드에서 수행 할 나타냅니다. 시작이 0 관련의 Runnable에서 JDK1.5에서 호출 가능이 증가. 주요 차이점은 호출 가능 () 메서드 호출 값을 반환하고 예외를 발생하지만, 실행 가능한 실행 () 메소드는 이러한 기능이 없습니다. 호출 미래의 객체는 계산 결과로드 반환 할 수 있습니다.

12. 자바 어떻게 경쟁 조건에?

가장 실용적인 멀티 스레드 애플리케이션에서, 두 개 이상의 스레드가 동일한 데이터에 대한 액세스를 공유 할 필요가있다. 내가 스레드가 같은 개체에 액세스하고, 각 스레드가 객체의 상태를 수정하는 방법을 호출하는 경우 어떤 일이 일어날까요? 상상, 서로의 발에 스레드를 강화. 스레드가 데이터에 액세스의 순서에 따르면, 손상된 객체의 원인이 될 수 있습니다. 이러한 상황은 일반적으로 경쟁 조건라고도합니다.

스레드를 중지하는 방법 13. 자바?

Java그것은 풍부한 API를 제공하지만 스레드를 중지 할 수있는 API를 제공하지 않습니다. JDK 1.0일부는 같은했을 것이다 stop(), suspend()resume()제어 방법, 그러나 때문에 교착 상태의 잠재적 인 위협의. 자바 API의 디자이너가 스레드를 중지 호환 및 스레드 안전한 방법을 제공하지 않을 후에 따라서 JDK의 후속 버전에서 그들은 포기했다. run()또는 call()수동으로 스레드를 종료 할 경우 스레드의 방법은 자동으로 종료됩니다 실행할 때, 당신이 사용할 수있는 volatile출구로 부울 변수를 run()루프 또는 인터럽트 스레드 방법으로 작업을 취소 할 수 있습니다.

14. 자바는 통지와의 notifyAll의 차이점은 무엇입니까?

한 가지 분명한 이유는 각 개체가 스레드에 의해 얻은 잠금을 갖고, 잠금이 자바 객체 수준이 아닌 스레드 수준을 제공 할 것입니다. 스레드가 어떤 잠금을 대기해야하는 경우 다음 감지하는 객체 대기 () 메서드를 호출합니다. 대기 () 메소드는 스레드가 잠금을 기다리는 Thread 클래스에 정의 된 경우 명확하지 않다. 대기는, 통지 및 잠금 객체에 속해 있기 때문에 그들이 Object 클래스에 정의되어 있으므로의 notifyAll은 잠금 수준의 작업이기 때문에 간단히했습니다.

동시 모음 15. 자바의 동기화 설정의 차이점은 무엇입니까?

동시 수집은 멀티 - 스레딩과 병행 세트는 스레드 안전의 적절한 세트가 높은 확장 성 컬렉션에 의해 복잡하지만, 제공하다 동기화된다. 에서는 Java1.5종래 프로그래머를 사용하는 유일한 시스템의 팽창을 방해, 충돌이 발생할 수 동시 멀티 스레딩 시간 동기화 세트. Java5 같은 동시 컬렉션을 소개 ConcurrentHashMap뿐만 아니라 스레드 안전도 확장 성을 개선하기 위해 격리 및 내부 파티션과 다른 현대적인 기술을 잠급 제공합니다.

16. 스레드 풀은 무엇인가?

스레드 풀은 멀티 스레드 처리 형태, 관리 할 넘겨 작업을 수행 할 태스크 처리 스레드 풀 스레드 풀에 제출 될 것입니다. 각 요청을 처리하기 위해 스레드를 생성 할 경우, 여러 작업을 수행 할 수 있습니다, 서버의 자원은 곧 종종 스레드 풀 스레드 생성을 사용하여 소진 될 것이며 파괴를 감소시킬 수 있으며, 각 작업자 스레드는 재사용 할 수 .

17. 왜 스레드 풀을 사용합니까?

시간이 업무를 처리하는 시간보다 더 길어질 수 있습니다 스레드를 만들고 스레드 지출이 비교적 큰 파괴. 이러한 빈번한 쓰레드 생성 및 스레드의 파괴, 플러스 비즈니스 작업자 스레드가 시간의 시스템 리소스를 소모, 그것은 시스템 리소스가 부족하여 발생할 수 있습니다. (우리는 생성하고 스레드를 제거 파괴의 과정을 넣을 수 있습니다)

18. 역할 스레드 풀은 무엇인가?

스레드 풀 기능은 시스템에서 실행 스레드의 수를 제한하는 것입니다.

효율성을 개선하기 위해 1, 수영장에서 스레드의 특정 번호를 생성, 그래서 수영장에서 훨씬 빠르게 스레드 개체를 만드는 데 필요한 것보다이 시간을 얻을 수있는 시간을 사용해야합니다.

2, 관리의 동일한 풀의 스레드 풀 스레드 관리 코드를 작성할 수 있습니다 관리를 용이하게하기 위해, 예를 들어, 시작시 100 개 스레드를 만들 수있는 프로그램, 작업에 스레드를 할당 요청이 101 동시에이 발생하는 경우,이있을 때마다이있다 요청이 대기 할 수있는 여분이, 끝없는 원인을 시스템에서 충돌을 방지하기 위해 스레드를 생성 할 것을 요청.

몇 가지 일반적인 스레드 풀 및 사용 시나리오에 대한 19 이야기?

1 newSingleThreadExecutor만 모든 작업은 지정된 순서 (FIFO, LIFO, 우선 순위)에서 수행되도록에만 작업자 스레드 작업을 수행하는 데 사용, 단일 스레드 스레드 풀을 만들 수 있습니다.

2, newFixedThreadPool고정 된 크기의 스레드 풀을 만들고, 동시 스레드의 최대 수를 제어 할 수 있습니다, 초과 스레드는 큐에 대기합니다.

3, newCachedThreadPool재활용하지 않을 경우, 유휴 스레드를 되찾기 위해, 더 이상 치료가 필요한 경우에 비해, 새로운 실을 수있는 유연성을 스레드 풀을 캐시 스레드 풀을 만들 수 있습니다.

(4) newScheduledThreadPool정규주기 태스크의 실행을 지원하기 위해 고정 길이 쓰레드 풀을 생성한다.

풀의 스레드 (20) 몇 가지 중요한 매개 변수?

corePoolSize아무 소용이 단지 시간에 수영장, 이러한 핵심 스레드, 스레드의 핵심 번호는 복구 할 수 없습니다

maximumPoolSize저장할 수있는 스레드 풀 스레드의 최대 수

keepAliveTime스레드 풀에서, 핵심 스레드뿐만 아니라 심지어 작업이없는 상태에서 해제 할 수 없기 때문에 핵심 스레드가 아닌 다른 이외에 가장 긴 스레드 풀의 시간이 유지 될 수이며, 나머지 모든 생존 기간이다, 그 비 핵심 스레드를 의미한다 긴 대기 시간을 예약 할 수 있습니다. util그것은 유닛의 시간을 계산하는 것이다.

workQueue큐를 기다리고, 작업이 실행 대기 큐 작업에 저장 될 수있는, 실행이 (FIFO) FIFIO의 원칙이다.

threadFactory그것은 스레드 스레드 공장을 만드는 것입니다.

handler, 거부 전략인가, 우리는 전체 작업 후, 특정 작업을 수행하기를 거부 할 수 있습니다.

21. 전략 스레드 풀에 대해 이야기하기를 거부?

요청이 진행중인 작업, 시스템 처리하지만 온이 시간을 왔을 때, 우리는 정책은 서비스 거부입니다 취할 필요가있다. RejectedExecutionHandler 인터페이스는 작업 처리를 사용자 정의 할 수있는 방법을 거부 할 수있는 기회를 제공합니다. ThreadPoolExecutor에 이미 네 개의 처리 전략이 포함되어 있습니다.

  • AbortPolicy 전략 :이 전략은 던져 직접 제대로 작동 시스템을 방지 할 수 있습니다.

  • CallerRunsPolicy 전략 : 한 스레드 풀을 폐쇄하지 않는 한, 호출자의 스레드에서 직접 정책은 현재 작업이 삭제됩니다 실행합니다.

  • DiscardOleddestPolicy 전략 :이 전략은 작업이 실행되어야하는 가장 오래된 요청을 폐기하고 다시 현재 작업을 제출하려고합니다.

  • DiscardPolicy 전략 : 전략은 자동 폐기 작업은 치료없이 처리 할 수 ​​없습니다.

JDK 네 가지 종류뿐만 아니라 정책을 거부 기본적으로 제공, 우리는 사용자 정의하는 비즈니스 요구에 따라 전략을 거부 할 수 있습니다, 사용자 정의 방법은 간단이며, 직접 구현 RejectedExecutionHandler인터페이스가 될 수 있습니다.

22. 실행하고 그 차이를 제출?

우리의 임무는 실행 방법뿐만 아니라, 사용되는 방법을 실행하는 것입니다, A는 방법은 또한 우리가 제출 한 작업을 수행 할 수 있습니다 제출할 수있다.

이 두 가지 방법은 어떤 차이가 있습니까? 각각에서 어떤 시나리오? 우리는 간단한 분석을한다.

  • 단지 그것을 실행하는 스레드 풀 스레드를 던져 덜 장면의 반환 값에 대해 우려에 적용 실행합니다.

  • 시나리오는 반환 값에 초점을 맞출 필요가에 대한 방법은 적합 제출

스레드 풀의 사용 시나리오의 23 오가지?

  • newSingleThreadExecutor : 단일 스레드 순서에 필요한 시나리오의 실행을 보장하는 데 사용할 수있는 스레드 풀, 단 하나 개의 실행 스레드.

  • 인 newFixedThreadPool은 : 고정 된 크기의 스레드 풀을 수행 스레드의 수의 공지 된 동시 압력 한계 인 경우에 사용될 수있다.

  • newCachedThreadPool : 실행 시간을 처리 무한히 더 적합 확장 할 수 있습니다 스레드 풀은 상대적으로 작은 작업입니다.

  • 인 newScheduledThreadPool : 장면이주기적인 작업을 수행하기 위해 더 많은 배경 스레드를 필요에 대한 스레드 풀을 시작하려면 시작 시간을 지연시킬 수 있습니다.

  • newWorkStealingPool : 여러 개의 스레드 풀과 작업 큐, 당신은 병렬로 실행 스레드의 CPU 번호를 만들 현재 사용할 수있는 연결의 수를 줄일 수 있습니다.

24. 당신은 어떻게 스레드 풀을 닫습니다합니까? 초기화 스레드 풀 스레드의 수를 선택?

닫기 스레드 풀은 종료를 달성하기 위해 shutdownNow의 두 메서드를 호출 할 수 있습니다

shutdownNow의 : 작업의 존재에 모두의 폐지의 모든 발행 인터럽트 (), 작업의 중지 실행이 아직 시작되지 않은 실행을 수행, 그리고 시작하는 작업 목록으로 돌아갑니다.

종료 : 우리가 종료를 호출 할 때, 스레드 풀은 더 이상 새 작업을지지 않습니다 만, 제출 된 또는 업무에 강제 종료되지 않습니다.

작업이 IO가 집중적 경우, 일반적으로 필요로하는 스레드 수는 CPU 자원을 최대한 활용하기 위해, CPU의 두 배 이상 수를 설정합니다.

작업이 CPU를 많이 사용하는 경우, 일반적으로 단지에만 컨텍스트 스위치의 수를 늘릴 수 있습니다 더 많은 스레드를 추가 할 수 있습니다 CPU (1)의 수를 설정해야합니다 스레드 수, CPU 사용률이 증가 할 수 없습니다.

이들은 당신이 정말 온라인, 정확한 컨트롤이 필요하거나 될 수있는 큐와 스레드 풀에서 스레드의 수를 관찰 할 필요가 나중에 경우, 다만 기본적인 생각이다.

(25) 작업 큐를 가지고 스레드 풀의 어떤 종류의?

1,ArrayBlockingQueue

(제 1 출력에 제)이 FIFO 큐 원리 정렬 요소를 차단하는 경계 큐 어레이의 구성에 기초한다.

2, LinkedBlockingQueue차단리스트 큐 구조에 기초하여,이 큐 FIFO (선입)은 일반적으로 높은 특정 ArrayBlockingQueue를 이상의 요소를 조합. 정적 공장 메소드 Executors.newFixedThreadPool ()이 큐를 사용

삼,SynchronousQueue

블럭킹 대기열 성분은 저장되지 않는다. 다른 스레드가 제거 작업 호출, 또는 삽입 작업은 일반적으로 높은 LinkedBlockingQueue 등보다 정적 팩토리 메소드이 큐를 사용 Executors.newCachedThreadPool 처리량이 차단 된 상태로 될 때까지 각 삽입 작업은 기다려야합니다.

네,PriorityBlockingQueue

우선 순위 큐는 무제한 장애물이있다.

추천

(분석 설명과 함께) 제조업체 콘텐츠 수집을 작성 지속적으로 업데이트 ....

ProcessOn 통합 플랫폼은 온라인 매핑 도구입니다 -

미주

개인 마이크로 채널 대중 번호에 오신 것을 환영합니다주의 : 코더 프로그래밍 환영의 관심 코더는 프로그래밍 공개 번호, 메인 주 데이터 구조와 알고리즘을 자바 관련 지식, 지식과 원리, 봄 가족 버킷의 프레임 워크, 마이크로 서비스가 도로의 전투, 개발 운영 사례를 프로젝트 어느 날 인터넷 거대한 펜 기사 또는 면접 질문 및 PMP 프로젝트 관리 지식. 더 흥미로운 내용이 길에는 -, QQ 그룹 구축 : (211) 365 (315), 우리는 함께 그룹 교환 학습으로 환영합니다. 감사합니다! 또한 필요에 친구의 측면에 도입 될 수있다.

: Github에서에 포함 기사 github.com/CoderMerlin ... Gitee : gitee.com/573059382/c ... 환영 주의 와 스타 ~

마이크로 채널 공개 수

추천

출처juejin.im/post/5dd39e1be51d453fd16b196c