多线程之三:NSThread

1.创建线程

两种方式:

//初始化方法

thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(reduceCount)object:nil];

    [thread1 setName:@"减少count"];

    [thread1 start];//需要手动开始

//类方法:直接开始

    thread1 = [NSThread detachNewThreadSelector:@selector(reduceCount) toTarget:selfwithObject:nil];


2.在外部停止线程

首先取消线程:

[thread1 cancel];

然后在调用的方法内退出线程:

  if (thread1.isCancelled) {

        [NSThread exit];

   }


3.让线程暂停

 [NSThread sleepForTimeInterval:1.0];


[NSThread sleepUntilDate:date];


4.在主线程中更新UI

    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

- (void)updateUI:(UIImage *)image

{

    self.iv.image = image;

}


5,改变线程的优先级

每个线程执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个子线程默认的优先级为0.5.

thread1.threadPriority = 1.0;


thread2.threadPriority = 0.0;


6.线程同步与线程通信

使用@synchronized关键字

    @synchronized(self)

    {

        

    }

该关键字会降低程序的运行效率,因此只需对可能改变共享资源的方法使用该关键字.


同步锁(NSLock)

[lock lock];

...代码

[lock unlock];


7.使用NSCondition控制线程通信

NSCondtion实现了NSLocking协议,因此也可以调用lock,unlock来实现线程同步。除此之外,NSCondition可以让那些已经锁定NSCondition对象却无法继续执行的线程释放NSCondition对象,NSCondition对象也可以唤醒其他处于等待状态的线程。

NSCondition提供以下三个方法:

-wait:导致该线程一直等待,直到其他线程调用该NSCondition的signal方法或者broadcast方法唤醒该线程。

-signal:唤醒在此NSCondition对象上等待的单个线程(如果有多个线程则随机唤醒其中一个)

- broadcast:唤醒在此NSCondition对象上等待的所有线程。只有当前线程放弃对该NSCondition对象的锁定后,才可以执行被唤醒的线程.

- (void)add

{

    for (int i = 0; i < 500; i ++)

    {

        if (count>100) {

            

            [cond broadcast];

            [cond wait];

        }


        count++;

        NSLog(@"count= %d",count);

        [NSThread sleepForTimeInterval:0.1];

    }


}

- (void)reduce

{

    for (int i = 0; i < 500; i ++)

    {

        if (count<1)

        {

            [cond broadcast];

            [cond wait];

        }

        count--;

        NSLog(@"count=%d",count);

        [NSThread sleepForTimeInterval:0.1];

    }

}


8.线程通信的主要方法

    [self performSelector:@selector(run) onThread:thread1 withObject:image waitUntilDone:YES];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值