• 多线程之NSThread


    一、线程的创建和启动

    NSThread创建主要有两种直接方式:

    [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];

    NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                            selector:@selector(myThreadMainMethod:)
                                            object:nil];
    [myThread start];

    这两种方式的区别是:前一种一调用就会立即创建一个线程来做事情;而后一种虽然你 alloc 了也 init了,但是要直到我们手动调用 start 启动线程时才会真正去创建线程。这种延迟实现思想在很多跟资源相关的地方都有用到。后一种方式我们还可以在启动线程之前,对线程进行配置,比如设置 stack 大小,线程优先级。

    还有一种间接的方式,更加方便,我们甚至不需要显式编写 NSThread 相关代码。那就是利用 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程:
    [myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil];
    其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。

    二、线程同步

    介绍两种方法,第一,通过NSLock来实现

    BOOL moreToDo = YES;
    NSLock *theLock = [[NSLock alloc] init];
    ...
    while (moreToDo) {
        /* Do another increment of calculation */
        /* until there’s no more to do. */
        if ([theLock tryLock]) {
            /* Update display used by all threads. */
            [theLock unlock];
        }
    }

    第二,通过@synchronized指令来实现

    - (void)myMethod:(id)anObj
    {
        @synchronized(anObj)
        {
            // Everything between the braces is protected by the @synchronized directive.
        }
    }

    三、线程中通信

    线程在运行过程中,可能需要与其它线程进行通信。我们可以使用 NSObject 中的一些方法:
    在应用程序主线程中做事情:

    performSelectorOnMainThread:withObject:waitUntilDone:
    performSelectorOnMainThread:withObject:waitUntilDone:modes:

    在指定线程中做事情:

    performSelector:onThread:withObject:waitUntilDone:
    performSelector:onThread:withObject:waitUntilDone:modes:

    在当前线程中做事情:

    performSelector:withObject:afterDelay:
    performSelector:withObject:afterDelay:inModes:

    取消发送给当前线程的某个消息

    cancelPreviousPerformRequestsWithTarget:
    cancelPreviousPerformRequestsWithTarget:selector:object:

    如在我们在某个线程中下载数据,下载完成之后要通知主线程中更新界面等等,可以使用如下接口:

    - (void)myThreadMainMethod
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        // to do something in your thread job
        ...
        [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
        [pool release];
    }

     

     

     

  • 相关阅读:
    css
    10个顶级的CSS和Javascript动画框架推荐
    js格式化时间(自己修改并注释)
    分享一篇获取键盘数值的js(限制在IE浏览器)
    Myeclipse一个设置小技巧,加速编码提示。
    悲剧的代码工
    Log4j与commonlogging
    没有人的了
    不想被淘汰,就别做这八种人!
    MVN 资料一
  • 原文地址:https://www.cnblogs.com/foxmin/p/2628110.html
Copyright © 2020-2023  润新知