기사 스레드 2019 중간 수준의 안드로이드 개발자 인터뷰 답변

대답을 참조하여 실제 개발이 다를 수 있으므로 오해 또한 두려워하는, 그래서 그들은 여전히 ​​질문 자체가 이해하는 대답에 직면.주의! 포인트는 언급이 다시 시작됩니다, 그래서 다시 더 이해를 대답하지 않는 면접관에 대한 깊은 지식 질문입니다.

1. 스레드 풀의 혜택? 스레드 풀의 여러 매개 변수를 이해하고, 스레드 풀 장면 네 가지 종류를 사용하십니까?

참고 대답 :

스레드 풀을 사용의 이점은 자원 부족의 문제를 해결하기 위해, 생성 및 소비 된 시간과 시스템 자원에 스레드를 파괴의 오버 헤드를 줄이는 것입니다. 당신이 스레드 풀을 사용하지 않는 경우가 유사한 많은 수의 스레드가 소비 리드 메모리 또는 "오버 전환"문제를 만드는 시스템을 일으킬 수 요약

  • 재사용 객체 생성, 비용의 서거, 좋은 성능을 감소 스레드를 기존.
  • 막힘을 방지하기 위해, 자원에 대한 과도한 경쟁을 피하면서 효과적으로, 시스템 자원의 활용도를 향상, 동시 스레드의 최대 수를 제어 할 수 있습니다.
  • 그것은 보통, 단일 스레드의 동시 제어를 실행하도록 실행 타이밍을 제공한다.

다음과 같이 스레드 풀의 스레드 풀 스레드 풀 .Android 안드로이드 가장 일반적인 클래스는 직접 또는 간접적 ThreadPoolExecutor에 서로 다른 특성을 갖는 구성하여 서로 다른 특성을 달성 할 수있다 :

  • newCachedThreadPool은 : 만 비 핵심 스레드, 스레드의 최대 수는 매우 큰, 그것은 재활용됩니다 후 모든 스레드가 활성화 할 때, 그렇지 않으면, 유휴 스레드 (60 유휴 시간을 활용하는 새로운 작업에 대한 새 스레드를 작성하므로 스레드 풀은 0이 스레드가) 작업을 처리 할 수 있습니다.
    • 장점 : 상관 태스크 (SynchronousQuue 작업 큐가 빈 세트에 대응)를 즉시 실행한다; 비교가 훨씬 적은 시간이 걸리는 작업을 수행하는 장치.
  • 인 newFixedThreadPool은 : 오직 코어 스레드, 시간 제한이 스레드 풀 유휴 작업자 스레드가 해제되지 않을 때 실행됩니다 새 작업을 기다리고, 큐의 크기가 없기 때문에 모든 스레드가 활성화되어 고정 된 양, 일부 시스템 자원을 차지합니다.
    • 장점 : 외부 요청에 대한 빠른 응답
  • 인 newScheduledThreadPool는 : 고정 스레드의 핵심 번호, 비 핵심 스레드 제한되지 않는다 (안 작업이 유휴 즉시 회복 될 것입니다).
    • 장점 : 작업과 일정 기간의 작업 실행 타이밍을 반복
  • newSingleThreadExecutor : 하나 개의 코어 스레드는 모든 작업이 같은 스레드에서 순서대로 완료되었는지 확인합니다
    • 장점 : 스레드 동기화의 문제를 처리 할 필요가 없습니다

소스에 의해 실제로 여전히 가능한 ThreadPoolExecutor 클래스를 사용하는 위의 네 개의 스레드 풀 구현 이해할 수
여기에 그림 삽입 설명
2.Android는 스레드 클래스를 전환 쉽게 볼도를?

참고 대답 :

  • AsyncTask를 : 스레드 풀 하단 패키지와 처리기, 하위 UI 스레드에서 수행 백그라운드 작업 및 작업을 수행하기 쉬운.
  • HandlerThread : 스레드의 메시지 핸들러 내에서 사용될 수있는 루프를 가진다.
  • IntentService가 : 비동기, 그것은 자동으로 서비스, 내부 사용 HandlerThread을 중지합니다.

AsyncTask를의 원리에 대한 3 이야기

참고 대답 :

  • 두 AsyncTask를 스레드 풀 (SerialExecutor 및 THREAD_POOL_EXECUTOR) 및 처리기 (InternalHandler)가 있는데, 상기 작업이 대기열에 대해 스레드 풀 SerialExecutor 반면, 실제 스레드 풀로부터의 스위칭, InternalHandler는 실행 환경 태스크를 실행하기위한 스레드 풀 THREAD_POOL_EXECUTOR 메인 스레드.
  • sHandler 오브젝트가 메인 쓰레드로 생성되어야 sHandler을 요구 메인 스레드 실행 환경으로 전환 할 수 있도록하기 위해, 정적 핸들러 오브젝트이다. 정적 멤버는 클래스가로드 될 때 초기화, 그래서 이것은 그렇지 않으면 프로세스 AsyncTask를 작동하지 않습니다, AsyncTask를이 클래스는 메인 스레드로드해야 가장 필요로 할 것이기 때문에.

4.IntentService 사용은 무엇인가?

참고 대답 :

작업이 자동으로 중지됩니다 완료 될 때 수행하는 데 시간이 많이 걸리는 백그라운드 작업을 수행 할 수 IntentService 및 IntentService이기 때문에 왜 서비스, 일반 서비스와 달리, IntentService 자동으로 단순히보다 우선 순위로 연결 작업을 수행 할 수있는 하위 스레드를 만들 수 있습니다 스레드는 우선 순위가 높은 백그라운드 작업의 숫자의 구현을위한 IntentService 그래서 더 적합 시스템에 의해 살해 될 높은, 쉽지해야합니다.

5. 직접 활동에 서비스 사이의 차이를 만들 수있는 스레드와 스레드를 만드시겠습니까?

참고 대답 :

  • 그것은 활동에서 만든 : 스레드가 스레드를 생존하지 않았다 활동의 파괴, 이후 의미, 활동 책임, 사전 통지 활동 소식 및 이벤트의 특정 작업을 완료,이 활동 서비스입니다.
  • 서비스가 중간에서 만든 이 보통에서 onCreate 서비스의에서 생성 한 전체 서비스를 종료하지 않는 한, 스레드가 항상 백그라운드에서 수행 할 수 스레드의 긴 수명을 보장하는 유일한 방법입니다 ()의들의 OnDestroy에서 파괴 (). 따라서 APP의 독립적 인 몇 가지 배경 작업의 장기 구현에 적합한 서비스 스레드의 생성은 일반적이다 : 긴 연결 서비스에 서버를 유지합니다.

6.ThreadPoolExecutor 전략을 사용할 수 있습니까?

우리는 작업을 수행 할 수있는 ThreadPoolExecutor 다음과 같은 규칙을 따릅니다 : 참조 대답

  • 풀의 스레드 수는 커널 스레드 수에 도달하지 않는 경우, 직접 작업을 수행하는 커널 스레드를 시작합니다
  • 풀의 스레드 수에 도달하거나 커널 스레드의 수를 초과 한 경우 작업 큐가 실행을 위해 대기로, 다음 작업이 삽입됩니다.
  • 당신이 작업 큐에 2시 작업에서 할 수없는 경우 작업 큐가 꽉 차서 요구 사항을 충족하지 않는 스레드 풀에서 스레드의 최대 수는, 즉시 비 핵심 업무를 수행하는 스레드를 시작하면,이 시간, 종종있다.
  • 세 번째 포인트는 지정된 스레드 풀에서 스레드의 최대 수에 도달 한 경우,이 작업을 수행하기를 거부, ThreadPoolExecutor입니다 호출자에게 알리는 rejectedExecution RejectedExecutionHandler 메소드를 호출

7.Handler, 스레드 및 HandlerThread의 차이점은 무엇입니까?

참고 대답 :

  • 처리기 : 전송 및 메시지 처리를위한 안드로이드 책임, 당신은 그것을 통해 메인 스레드와 다른 스레드 지점 간의 메시지 통신을 구현할 수 있습니다.
  • 스레드 : 즉 자바 실행 처리 동작의 최소 단위는 프로세서의 기본 단위가 스케줄링을 실행한다. 혼자 프로그램을 모든 방법을 실행하는 과정.
  • HandlerThread가 : 클래스가 스레드에서 모든 패키지에 안드로이드에서 자바에 대한 스레드를 상속하지 않지만 스레드 HandlerThread 클래스에서 상속하는 클래스를 제공하기 위해 HandlerThread, 자바 스레드의이 클래스의 편리한 패키지를 많이 할. HandlerThread는 스레드로부터 상속, 그래서 그것은 본질적으로 스레드입니다. 차이점은 일반 스레드, 루퍼는 직접 사내를 실현하는 것이,이 핵심 메시지 메커니즘 처리기입니다. 자신의 루퍼을 가지고, 그것은 우리가 자신의 스레드에서 배포하고 메시지를 처리 할 수 있습니다. 당신은 다음 HandlerThread 수동으로 Looper.prepare ()와 Looper.loop () 메소드를 호출 할 필요가없는 경우.

8.ThreadLocal 원칙

참고 대답 :

의 ThreadLocal 클래스는 스레드 로컬 변수를 만드는 방법에 대한 것입니다. 사용 시나리오는 다음과 같이 :

  • 싱글 및 트랜잭션 ID와 등, 단일 스레드에 저장된 단일 스레드 컨텍스트 정보를 구현합니다.
  • 각 스레드가 해당 인스턴스를 가지고 있기 때문에 달성 스레드 안전, 비 - 스레드 안전 개체는 스레드 안전 사용의 ThreadLocal 후가 될 것이다. 일부 스레드 - 관련 데이터 베어러 파라미터들을 전달하는 전후에있어서의 피할 수있다.

여러 스레드를 사용해야하는 경우, 당신은 많은 문제 잠금 동기화 된 키워드를 사용하여이없는 일이 발생 변수를 공유 할 필요가 없으며, 각 스레드가 공유 스레드와 힙 메모리의 공간을 열 수와 동일 가변 공유 힙 버퍼 메모리에 의해 가변 버퍼 및 판독 동작은 스레드의 ThreadLocal, 로컬 변수에 대응하는 메모리. 마다 데이터가 판독되고 스레드 자체를 조작 할 수 있고, 변수에 의해 메인 메모리 버퍼와 상호 작용할 필요가 없다. 메인 메모리 데이터로 동기화 그것은 다시 스레드 내에서 작업 메모리에 복사 된 메인 메모리의 데이터를 수정하지 않습니다. ThreadLocal를 내부에 저장 스레드 독점 자원으로부터 스레드, CPU 처리량 감소로 인한 혼잡을 방지하기 위해 실을 수있다.

각 ThreadLocalMap 포함 스레드 ThreadLocalMap의 ThreadLocal 오브젝트는 키가 배타적 데이터 값이다.

9. 멀티 스레딩이 효율적으로 될 것입니다 (강점과 약점)

참고 대답 :
멀티 스레딩의 장점 :

  • 편리하고 효율적으로 공유 메모리 - 공유 메모리 멀티 프로세스를 더 불편, 멀티 프로세스 프로그래밍의 장점을 상쇄
  • 헤드 라이터 문맥 전환 - 주소 공간을 전환하지 않고 TLB 비어 있지 않은 상기 CR3 레지스터를 변경하지
  • 스레드에서 작업의 구현이 자동으로 파괴 된 후

멀티 스레딩 단점 :

  • 열기 쓰레드가 메모리 공간을 차지해야합니다 (기본적으로, 각 스레드는 시장 점유율 5백12킬로바이트있다)
  • 당신은 많은 수의 스레드를 열 경우, 프로그램의 성능을 저하, 메모리 공간을 많이 차지합니다
  • 호출 스레드에서 더 많은 스레드의 CPU 오버 헤드가 큰
  • 이러한 스레드 간 통신으로, 더 복잡한 프로그래밍, 멀티 스레드 데이터 공유

포괄적 인 멀티 스레딩에 그리기하는 것은 효율성을 향상시킬 수 있지만, 꽉 상황, 매일 개발 있도록해야되는 메모리 공간에서 부담하지 않을 수 있습니다

  • 자주 만들지 마십시오, 스레드를 파괴 스레드 풀을 사용하여
  • 스레드 간 통신 및 동기화를 줄 (가장 중요한)
  • 자주 쓰기 공유 데이터에 대한 필요성을 피하십시오
  • 거짓 공유 (거짓 공유)를 방지하기 위해, 공유 데이터 구조를 정렬
  • 블로킹 데이터 구조 / 알고리즘
  • (mmap과 같은) 시스템 호출을 발생할 수있는 피 확장 성 문제
  • 누락 된 페이지 예외의 큰 숫자를 방지하기 위해 거대한 페이지를 사용하려고
  • 대신 사용자 모드 커널 스레드의 가벼운 스레드를 사용할 수있는 경우

(10) 멀티 스레드는 하나의 예를 만들 수 있도록, 당신은 어떻게 할 것,

참고 대답 :

  • 로드 지연 - - 싱글 모드, 멀티 스레딩의 실시 예를 설립 고려 요인, 같은 스레드 안전로서, 많은 거기에 코드 보안 : 같은 공격 시퀀스의 예방으로, 공격을 방지 반사 (개인 방법은 반사를 방지하기위한 호출) - 성능 요인을
  • 굶주린 많은 구현, 게으른 (스레드 안전, 비 - 스레드 안전), 더블 체크 (DCL) 내부 클래스, 열거가있다

또한 11 스레드를 깨워 어떤 좋은 방법을 알립니다

참고 대답 :

  • 스레드 호출 () 메소드 개체 잠금 대기가있을 때, 다른 스레드가 잠금 개체를 취득 할 수있는 기회를 가지고, 개체 잠금을 얻을 수 있도록 현재의 thread가 현재 점유 큐 대기로 Object.wait 가입하고 잠금 개체를 해제하게됩니다 스레드 호출 () 메소드를 통지, 당신은 큐가 Object.wait 임의 일어나 하나 개의 스레드에서 기다릴 수 있습니다 (순서에 관계없이 추가 임의 이후, 높은 우선 순위가 높은 확률을 일깨워됩니다)
  • 당신이가는 notifyAll을 호출하면 () 메소드는 모든 스레드를 깨어. 참고 : 즉시 객체의 잠금을 해제하지 않습니다 () 메소드를 통지 호출 한 후에 스레드는 완성 된 개체 잠금의 릴리스가 나올 때까지 기다리는 것입니다.

(12) ANR은 무엇인가? ANR 어떻게됩니까? 방법을 피하기 위해? 문제가 ANR 발생하는 방법을 신속하게 찾을 수의 코드를 보지 않고?

참고 대답 :

  • ANR (응용 프로그램, 응용 프로그램이 응답하지 응답하지) : 운영 체제가 일정 시간을 처리 할 수 ​​없을 때 나타납니다 시스템 레벨의 ANR 대화 상자에있을 것입니다
  • 5 초 내에 사용자 입력 이벤트에 대한 응답, 브로드 캐스트 리시버에서, 10 초 내에 종료되지 않습니다이 없었기 때문에 ANR이 발생 될 수 있습니다 서비스를 종료하지 않은 20 대
  • ANR은 메인 스레드에서 시간이 많이 걸리는 작업을 수행하지 않도록하고 싶지 않은,하지만 같은 상속 스레드가 하위 스레드 방식으로 열거 나 AsyncTask를, IntentService를 사용 Runnable를 구현 HandlerThread 등

이 장에 스레드가 끝날 때, 안드로이드는 내 홈페이지 관련 따를 수 많은 연구 자료를 필요로
여기에 그림 삽입 설명
오늘 업데이트 된 비디오 : 안드로이드 기본을

무엇 JNI 예.
기본 방법은 등록합니다.
JNI 데이터 형식 변환.
기본 자바와 통신하는 방법에 대해 설명합니다.

추천

출처blog.csdn.net/Android_SE/article/details/91993979