2017-04-26 2 views
3

저는 Java에서 작업했고 스레드와 스레드 풀을 사용하여 작업을 수행했습니다.스레드 풀 : DispatchQueue.main.async

누군가 스레드의 생성 방법을 설명하고 신속하게 스레드 풀에서 공간을 할당 할 수 있는지 궁금합니다.

또한

Dispatch.main.async { 
// some code 
} 

는 새로운 스레드를 작성 또는 비동기 적으로 작업을 실행합니까? 미리

감사 =)

답변

3

코드에서 메인 큐 (Dispatch.main)에 코드 블록을 큐잉하고 코드를 실행하기 전에 즉시 (.async) 리턴한다.

대기열에서 사용하는 스레드를 제어 할 권한이 없습니다.

let serialQueue = DispatchQueue(label: "queuename") 
serialQueue.async { 
    ... 
} 

당신은 당신의 코드가 실행되는 스레드 모르는 : 당신은 자신의 큐를 만들 경우에도 마찬가지입니다.


는 업데이트 : 메인 큐에 작업을 파견하는 경우

가로 정확하게 코멘트에 Paulw11에 의해 명시된 ,

는 ..., 주 스레드에서 실행하도록 보장 . 다른 큐에 작업을 디스패치하면 실행될 스레드를 알 수 없습니다. 주 스레드 또는 다른 스레드에서 실행될 수 있습니다.

+5

주 큐에서 작업을 디스패치하면 주 스레드에서 실행되는 것이 보장됩니다. 다른 큐에 작업을 디스패치하면 실행될 스레드를 알 수 없습니다. 주 스레드 또는 다른 스레드에서 실행될 수 있습니다. – Paulw11

+0

@ Paulw11 수정하십시오. 업데이트 된 답변. – shallowThought

6

대기열과 스레드는 별도의 개념입니다. 대기열은 순서가 정해진 (때로는 우선 순위가 정해진) 블럭들의 순서로 실행됩니다. 구현 세부 사항 (대부분)은 블록을 실행하기 위해 스레드로 예약해야하지만, 이것이 주요 사항은 아닙니다.

따라서 Dispatch.main.async은 블록을 기본 대기열로 발송 (추가)합니다. 메인 큐는 직렬이며, 메인 쓰레드에서만 독점적으로 실행될 것이라는 점에서 다소 특별합니다 (Paulw11에서 언급했듯이). 그것은 또한 메인 runloop과 연관 될 것을 약속합니다. 이 기능을 이해하면 "대기열에 블록을 추가합니다"라는 개념이 중요합니다. 대기열에서 일을 설계하는 방법과 스레드에서 설계하는 방법에 중대한 영향을 미치기 때문입니다. async이 "지금 실행하십시오."라는 의미는 아닙니다. 이것은 "대기열에 붙어 있지만 대기하지 마십시오."라는 의미입니다.

디자인이 어떻게 다른지에 대한 좋은 예로서 대기열에 무언가를 배치한다고해서 이 실행됩니다 (버그 또는 교착 상태가없는 경우에도 마찬가지 임). 대기열을 일시 중단하여 블록 예약을 중지하는 것이 가능하고 유용합니다. 대기열을 다른 대기열에 묶어서 대기열이 일정을 "예약"할 때 대기열을 실행하지 않고 다른 대기열에 놓을 수 있습니다. "백그라운드에서 실행"과 관련이없는 대기열로 수행 할 수있는 많은 작업이 있습니다. 완료 처리기를 블록에 연결할 수 있습니다. 그룹을 사용하여 블록 모음을 기다릴 수 있습니다. GCD는 동시성에 대해 생각하는 방법입니다. 병렬 처리는 단지 부수적 인 이점입니다. (이 개념에 대한 훌륭한 논의는 Concurrency is not parallelism by Rob Pike입니다. Go에 있지만 개념은 그대로 적용됩니다.주요 큐에 실행하는 동안 Dispatch.main.async을 호출하는 경우)

는, 그 블록은 절대적으로 확신하지 에이 현재 블록이 완료 될 때까지 실행됩니다. UIKit 및 AppKit에서 "현재 블록 완료"는 종종 "OS에서 호출 한 메소드에서 복귀"를 의미합니다. 이런 방식으로 구현되지는 않았지만 OS에서 호출 할 때마다 Dispatch.main.async으로 호출되는 것을 가장 할 수 있습니다.

이렇게하면 Dispatch.main.sync (주)을 메인 대기열에서 절대로 호출해서는 안됩니다. 그 블록은 당신이 돌아 오기를 기다릴 것이고, 블록이 끝날 때까지 기다릴 것입니다. 고전적인 교착 상태.

일반적으로 스레드 풀은 iOS에서 귀하의 비즈니스가 아닙니다. 구현 세부 사항입니다. 때때로 성능상의 이유로 생각할 필요가 있지만, 너무 많이 생각하고 있다면 동시성을 잘못 설계 한 것일 수 있습니다.

Java에서오고 있다면, 동시성 프로그래밍 가이드에서 Migrating Away From Threads을 확실히 읽고 싶습니다. 대기열의 스레드 기반 패턴을 다시 생각하는 방법에 대한 확실한 리소스입니다.