iOS-NSThread 멀티스레드

4630 단어
NSThread
1. 스레드 생성 및 시작
하나의 NSThread 객체는 하나의 스레드를 나타냅니다.
  • 생성 방법 1:
  • 장점: 스레드를 더 많이 설정할 수 있음
  • NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [thread start];
    //      ,     thread   self run  
    
    //    
    - (void)setName:(NSString *)n;
    - (NSString *)name;
    
  • 생성 방법 2
  • 스레드를 만든 후 자동으로 스레드를 시작합니다
    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
      
    //         
    [self performSelectorInBackground:@selector(run) withObject:nil];

    상기 2가지 라인 생성 방식의 장단점 + 장점: 간단하고 빠르며 수동으로 start 방법을 호출하지 않아도 시스템이 자동으로 시작됩니다 + 단점: 라인에 대해 더 자세한 설정을 할 수 없습니다
    2. 관련 사용 방법
    주 스레드 관련 사용법
    + (NSThread *)mainThread; //      
    - (BOOL)isMainThread; //       
    + (BOOL)isMainThread; //       

    현재 스레드 가져오기
    NSThread *current = [NSThread currentThread];

    스레드 이름
    - (void)setName:(NSString *)n;
    - (NSString *)name;

    3. 라인의 상태
  • 생성 -> 새 상태
  • start -> 호출 준비
  • CPU 호출 -> 실행
  • sleep->막힘
  • 집행 완료 또는 강제 폐쇄 -> 사망
  • 주의: 라인을 강제로 닫으면 닫힌 후의 다른 동작을 실행할 수 없습니다
  • //       
    // [NSThread sleepForTimeInterval:2.0];
    [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
    //    
    [NSThread exit];

    4. 자원 경쟁
    여러 라인이 같은 자원에 동시에 접근할 수 있기 때문에 발생할 수 있다.
    이 문제를 해결하기 위해 사용 가능
  • 상호 배척 잠금 사용 형식
  • @synchronized(잠금 대상)
  • {//잠금이 필요한 코드} 주의: 코드를 잠그는 데는 1개의 자물쇠만 사용하고 여러 개의 자물쇠를 사용하는 것은 무효입니다
  • 상호 배척 자물쇠의 장단점
  • 장점: 다중 스레드로 인한 자원 강탈로 인한 데이터 안전 문제를 효과적으로 방지할 수 있다
  • 단점: CPU 리소스가 많이 소모됨
  • 상호 배척 자물쇠의 사용 전제: 여러 라인이 같은 자원을 빼앗는다
  • 관련 전문 용어: 스레드 동기화
  • 스레드 동기화란 여러 스레드가 같은 라인에서 실행된다는 뜻
  • 상호 배척 자물쇠는 라인 동기화 기술을 사용했다
  • [NSUserDefaults standardUserDefaults] synchronize의 빠른 기억 방법
  • 개발 중 자물쇠를 채우려면 일반적으로self@synchronized(self){}
  • 5. 원자와 비원자 속성
  • OC는 속성을 정의할 때nonatomic와tomic 두 가지 선택이 있다
  • tomic: 원자 속성,setter 방법에 잠금(기본값은 tomic)
  • nonatomic: 비원자 속성,setter 방법에 자물쇠를 채우지 않습니다
  • nonatomic와 atomic 비교
  • atomic: 라인이 안전하고 대량의 자원을 소모해야 한다
  • nonatomic: 비선정 안전, 메모리 작은 모바일 기기에 적합
  • iOS 개발 권장사항
  • 모든 속성은 nonatomic
  • 로 명시됨
  • 같은 자원을 다중 라인으로 빼앗는 것을 최대한 피한다
  • 잠금, 자원 강탈의 업무 논리를 서버에 맡겨 처리하고 이동 클라이언트의 압력을 줄인다

  • 참고 사항:
  • atomic시스템이 자동으로 우리에게 추가한 자물쇠는 서로 밀어내는 자물쇠가 아니라 자전거 자물쇠
  • 상호 배척 자물쇠와 자전거 자물쇠의 공통점
  • 다중 스레드가 같은 시간에 한 스레드만 조작할 수 있음을 보장할 수 있다
  • 상호 배척 자물쇠와 자전거 자물쇠의 차이점
  • 상호 배척 자물쇠라면 지금 잠겼다면 뒤에 오는 라인은'휴면'상태로 들어가 잠금이 풀릴 때까지 깨우고 계속 실행
  • 자전거 자물쇠라면 지금 잠겼다면 뒤에 오는 라인이 휴면 상태에 들어가지 않고 자물쇠가 풀릴 때까지 바보같이 기다린다
  • 자전거 자물쇠는 비교적 짧은 조작을 하기에 더욱 적합하다

  • 6, 라인 간 통신
    예:
    일반적으로 하위 스레드에서 비교적 시간을 소모하는 조작, 예를 들어 그림의 다운로드를 한 다음에 메인 스레드에서 UI를 업데이트한다
  • 서브스레드를 만들고 그 안에서 그림을 다운로드
    NSURL *url = [NSURL URLWithString:@"http://b.hiphotos.baidu.com/image/pic/item/e4dde71190ef76c666af095f9e16fdfaaf516741.jpg"];
     [self performSelectorInBackground:@selector(download2:) withObject:url];
  • 기본 스레드 업데이트 UI로 돌아가기
  • - (void)download2:(NSURL *)url
    {
        //         
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        //      ,   
        //[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
        //      ,   
        //[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
        //      ,   
        [self performSelector:@selector(showImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
        //[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO];
    }
  • performSelectorOnMainThread 방법에서waitUntilDone:NO 매개 변수의 의미
  • YES: 그러면 주 라인의 방법이 실행될 때까지 기다렸다가 다음 줄의 코드를 계속 실행합니다
  • 만약에 NO: 그러면 주 라인의 방법이 실행될 때까지 기다리지 않아도 다음 줄의 낮은 줄을 계속 실행할 수 있습니까
  • 참고: UI 업데이트는 주 스레드에서 반드시 업데이트해야 합니다
  •  [self performSelectorInBackground:@selector(download2:) withObject:url];
    
    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
    
    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO];
    
    
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
    
    [self performSelector:@selector(showImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
    

    좋은 웹페이지 즐겨찾기