스레드 풀을 사용하여 안드로이드

스레드 풀 스레드, 왜 스레드 풀을 사용하여

스레드 1, 안드로이드

구별 메인 스레드와 안드로이드에서 자식 스레드. 메인 쓰레드는 자식 스레드가 주로 등 일부 네트워크 운영, IO 요청으로 더 큰 시간이 소요되는 작업의 일부를 처리하는 데 사용되는 동안 주로 몇 가지 인터페이스 관련 처리하기 위해 UI 스레드로 알려져있다 메인 스레드에서이 시간이 많이 걸리는 작업을 처리하면, 현상 ANR이있을 수 있습니다 (응용 프로그램은 직접 붙어).

풀 2, 안드로이드 스레드

스레드 풀, 쇼에서 우리는 등등 새로운 스레드의 역할, 스레드 관리, 스레드 스케줄링 및 플레이 연못을 포함하는 스레드 풀 스레드의 이름의 의미를 알고있다.

3. 왜 스레드 풀을 사용한다

이제 안드로이드는 이미 스레드의 개념을 가지고, 왜 스레드 풀을 사용할 필요가? 우리는 두 가지 측면에서 스레드 풀을 사용하는 이유를 제공합니다.

  • 모든 스레드의 우선 새에 소비하는 시간의 기간 네트워크 많은 수의 요청, 당신은 여러 스레드를 생성하고 파괴 할 필요가있는 경우 재산의 파괴, 존재, 성능 손실은 상상 할 수 있습니다.
  • 둘째, CPU를 차지합니다 실행 기간의 여러 스레드가 있습니다. 우리는 하나의 CPU가있는 경우, 스레드를 실행하는 CPU가 각 스레드에 시간을 할당합니다 차례로 실행되는 것을 알고있다. 동시에 하나 이상의 아이가 스레드가있는 경우, 다음 메인 스레드에 할당 된 해당 CPU의 실행 시간은 앱 있도록 가능성 Caton 현상이 나타납니다 덜되고있다. 위의 두 가지 이유의 관점에서, 우리는 스레드 풀의 파괴에 의해 관리되는 등 이러한 스레드 풀, 스레드 생성, 스케줄링의 개념에 가지고, 그래서 당신은 스레드가 항상 새 스레드를 생성하지 않는 재사용 할 수 있습니다, 스레드 생성과 재산 손실의 파괴를 줄일 수 있습니다. 스레드 수는 응용 프로그램이 관리 가능한 범위에서 유지되도록 메인 쓰레드의 자원을 점유하는 여러 스레드를 제어 할 수 있도록 동시에 스레드 풀은 생성 된 스레드의 수를 제한합니다.

두, 스레드 풀의 도입에 안드로이드

1 스레드 풀 건설

안드로이드 스레드 풀에있는 ThreadPoolExecutor 개체입니다. 우리는 처음에 ThreadPoolExecutor의 생성자 봐.

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
复制代码

우리는 여러 매개 변수의 현재 의미에 대해 말했다되었습니다 : 첫 번째 매개 변수는 corePoolSize를의 인 스레드의 핵심 번호 , 즉 너무 많은 스레드가 작업을 수행 할 스레드가없는 경우에도, 적어도 풀에가 말을하는 것입니다. 그러나 스레드 풀은 사실, 다음으로 설정 allowCoreThreadTimeOut 경우이 한 가지 예외가있다 제한 시간 (이 KeepAliveTime) 도착 후 파괴됩니다 커널 스레드. 두 번째 매개 변수는 maximumPoolSize를하다 스레드 풀에서 스레드의 최대 수 . 활성 스레드의 수가이 수에 도달하면 새 작업은 나중에 차단 추가됩니다. 세 번째 매개 변수는이 KeepAliveTime의되어 스레드 연결 유지 시간이 핵심 스레드 풀 스레드 수보다 더 많은 스레드가있는 경우, 즉, 다음이 KeepAliveTime보다, 새로운 작업이 올 경우, 스레드의 작업이 아닙니다 순간 타이머를 시작 스레드가 파괴됩니다. 설정 allowCoreThreadTimeOut에 해당하는 경우 그리고, 시간이 상기 제 1 이상 시간 제한 . 네 번째 파라미터 유닛 타이밍 파라미터의 제 3 유닛은 , 등등 초 및이 밀리 초. 다섯 번째 파라미터 Workqueue는 작업 대기열 스레드 풀은 상기 큐의 Runnable 객체 (개체의 Runnable 태스크 임) 수행 방법에 의해 전달 위에 유지한다. 작업 대기열이 유형 BlockQueue 유형, 즉 차단 큐 작업 대기열의 개수가 0 일 때, 태스크를 수행하는 동작은 차단 될 것이다; 작업 대기열의 수 (활성 스레드가 스레드의 최대 개수에 도달) 찼을 때, 동작을 추가 그것은 차단됩니다. 여섯 번째 매개 변수 ThreadFactory를은 스레드 공장새 스레드 풀 스레드를 생성해야하는 경우, 스레드 팩토리는 스레드 풀에 스레드를 제공하기 위해 사용합니다. 일곱 번째 파라미터 핸들러하는 정책을 거부 큐가 가득차면 경계 큐를 사용하는 스레드 풀 (즉 다섯 번째 파라미터이다), 태스크는 스레드 풀 거부 정책에 추가 될 때.

2, 스레드 풀의 분류

I, FixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}
复制代码

우리는 가능한 ThreadPoolExecutor 생성자라는 FixedThreadPool 건물을 볼 수 있습니다. 위의는 여러 기능 FixedThreadPool를 호출 볼 수 있습니다에서 :

  • 그것은 스레드의 핵심 수의 스레드의 최대 수는 스레드가 유휴 상태 일 때 스레드가 파괴되지 않음을 의미하는 동일 (때문에 스레드와 같은 핵심 스레드의 최대 수의 수). 하지만 스레드는 연결 유지 시간이 KeepAliveTime 세트를 0으로, 스레드 풀 스레드 사실 allowCoreThreadTimeOut로 설정하면 때, 유휴 상태에 곧 파괴 될 것이라는 점을 의미한다. 모든 스레드가 활성화되면, 새 작업은 대기 상태에있을 것입니다, 유휴 스레드가있을 때 수행.

II, CacheThreadPool

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
复制代码

당신은 CacheThreadPool있는 ThreadPoolExecutor 생성자를 구축 할 수있는 전화를 볼 수 있습니다. 위에서 그것은 여러 기능 CacheThreadPool를 호출 볼 수 있습니다 :

  • 핵심 스레드 카운트는 Integer.MAX_VALUE 쓰레드의 최대 수는 (제한으로 간주 될 수있다) 0이다. 이 KeepAliveTime 스레드 연결 유지 시간은 60 초입니다. 이 풀의 모든 스레드가 활성화 된 경우, 작업을 수행하기 위해 새로운 스레드를 생성하는 의미가 더 핵심 스레드 없지만, thread가 생존 유지 60 초를 가지고 있으며, 비록 유휴 스레드 풀 스레드 (있는 경우 바로 아래 유휴 유휴 스레드의 사용에) 파괴되지 않는다. 스레드 작업이에 작업을 추가 할 수 있습니다 수행 할 수있는 경우에만 작업 큐 SynchronousQueue는 동기 블록 큐는 그 큐는, 어떤 능력이 없음을 주목해야한다. 위의 CacheThreadPool의 특성에서 볼 수 있듯이이 스레드가 언제든지 작업을 수행 할 수 있습니다 (또는에 새로운, 또는 유휴 스레드입니다)을 보장하기 위하여, 그래서 방해가 나타나지 않습니다. 구체적인 설명 BlockQueue에 대해, 우리는 볼 수 있습니다 자바 멀티 스레딩 - 도구 기사 -BlockQueue 이 기사를. 우리가 작업을 수행해야하지만 이러한 작업은 시간과 상대적으로 낮은 경우 속성 CacheThreadPool에 대한 그래서, CacheThreadPool을 사용하는 것이 좋습니다.

III, ScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}	

public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}
复制代码

당신은 스케줄 할 수있는 ThreadPoolExecutor 생성자를 구축 할 수있는 전화를 볼 수 있습니다. 위에서 그것은 여러 기능로 스케줄을 호출 볼 수 있습니다 :

  • Integer.MAX_VALUE를 쓰레드의 최대 수 (제한으로 간주 될 수 있음) 동안 스레드 핵심 수는 고정된다. 이 KeepAliveTime 스레드 연결 유지 시간은 0이다. 이 스레드 풀의 스레드 수를 초과하는 경우, 코어 끈이 곧 파괴 될 것이다, 아이들 다운 것을 의미한다. ScheduledThreadPool 일반적으로 어떤 작업을 수행하는 데 사용되거나 타이밍 작업은 어떤 일정 기간 반복된다. 다른 지연 executor.schedule 의해 수행 될 수있다 각각의 타이밍 사이클 반복 작업 (과부하 여러 방법이 있음).

IV, SingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}
复制代码

당신은 SingleThreadExecutor있는 ThreadPoolExecutor 생성자를 구축 할 수있는 전화를 볼 수 있습니다. 위에서 그것은 여러 기능 SingleThreadExecutor를 호출 볼 수 있습니다 :

  • 스레드의 핵심 수는 스레드 연결 유지 시간이 KeepAliveTime이 최대 만 스레드 풀 스레드가 존재하고 스레드가 실행 중이거나 유휴 상태 여부,하지 수 있도록 즉, 0, 1 스레드의 최대 수입니다, 1 그것은 파괴된다. SingleThreadExecutor 모든 작업이 스레드에서 순서대로 실행되는 것을 보장합니다.

추천

출처juejin.im/post/5d7318915188256f3b09bb50