多线程3

//

//  ViewController.m

//  UI-NO.24多线程-1

//

//  Created by Bruce on 15/8/25.

//  Copyright (c) 2015年 Bruce. All rights reserved.

//

/*

 当用户下载资源、进行图像处理、耗时数据处理等任务时 往往希望操作这个任务的时候 其他的操作不会被中断 这时候 就用到了 多线程

 

 

 在单线程中一个线程只能执行一个任务,一个任务处理不完另一个任务就不能开始,这样会影响用户体验 让用户感觉APP卡顿

 

 

 现在苹果手机都是多核处理器,这样我们可以把一个任务分成多个步骤,在不要求顺序的情况下 使用多线程既能解决线程阻塞 增加用户体验又能充分利用多核处理器运行能力

 

 

 

 每个应程序的内部,存在一个或多个执行线程,它同时或在一个几乎同时执行不同的操作

 

 

 面试题:什么是进程?什么是线程?什么是多线程?

 进程与线程:每个系统运行的程序都是一个进程,每个进程里面包含了一到多个线程

 

 线程是一组指令的集合,程序中一个单一的顺序控制流程,是一个程序中,独立运行的程序片段(一个应用程序里面 单一的顺序控制执行的一个任务)

 

 

 程序运行后,系统会创建一个叫做(main)主线程的线程,所有的UI控件都必须运行在主线程中,所以有人也叫它UI线程

 

 

 如果将所有的任务都放在主线程中,容易造成UI阻塞

 

 

 多线程:在同一个应用程序内,同时运行多个线程,完成不同的工作,叫做多线程

 

 

 为什么要使用多线程:单线程的应用程序中,代码沿直线执行,只有前面的代码执行完了,才会去执行后面的代码,中间这段时间,实际上就处于等待状态。当用户执行某项操作,比如上传文件,或者下载文件,主线程会执行这个任务,直到上传结束后,主线程才能继续后面的工作,在这短时间内,主线程处于忙碌状态,不会对用户的请求做出任何反应,最直观的感受就是界面卡死,特别是操作这个任务需要大量的时间的时候就更为明显

 既然单一的一个线程不能满足我们的需求,那我们就可以使用今天要讲的多线程进行操作,在用户需要上传或者下载文件的时候,开辟一个独立的线程,专门负责这个任务,这样两个线程就会并行去工作,主线程也就不用花费这么久去等待去更新界面了

 当然,使用多线程有利有弊,多线程高效的背后是代码复杂程度的上升,需要管理线程之间的同步和互斥,需要协调线程间的通信,这就是我们常说的线程管理

 

 

 在iOS中每个进程启动后都会建立一个主线程(UI线程),在iOS中除了主线程,其他子线程是独立于Cocoa Touch的

 

 

 // iOS中有几种多线程方式

 iOS中有三种多线程策略供开发者使用:NSThread、NSOperation(基类不可以直接使用  只能使用他的子类)、GCD(Grand Central Dispatch)

//  GCD 苹果 推荐的一种 实现 多线程的方式

 

 

 

 // 轻量级 :对系统框架的依赖性的程度

 NSThread:是这三种策略里面相对轻量级的,需要自己去管理他的生命周期,以及线程之间的同步,线程共享同一应用程序的部分内存空间,他们拥有对数据相同的访问权限,所以得协调多个线程对同一数据的访问,常用的做法是在访问之前加锁,这会导致一定的性能开销

 

 

 NSThread的创建和启动:

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

 init

 这种方式得手动去启动线程,虽然我们alloc init了 但是只有我们start的时候才会真正去创建去启动这个线程(这是一种延迟实现的思想)

 

 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

 这种创建线程的方式,会立即开辟一个线程并启动线程

 

 

 线程之间的通讯

 performSelectorOnMainThread withObject:waitUntilDone:

 更新主线程

 performSelector:onThread:withObject:waitUntilDone:

 更新指定子线程

 

 

 解决 阻塞 主线程

 */

#import "ViewController.h"

 

@interface ViewController ()

{

    UIImageView *pointView;

    

    NSThread *newThread;

    NSCondition *condition;

    int ticketNum;

    int count;

}

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    /*

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

     //    这种创建线程的方式,会立即开辟一个线程并启动线程

     NSLog(@"主线程");

     */

    

    /*

     newThread = [[NSThread alloc]initWithTarget:self selector:@selector(updata1) object:nil];

     [newThread start];

     NSLog(@"主线程");

     //    这种方式得手动去启动线程,虽然我们alloc init了 但是只有我们start的时候才会真正去创建去启动这个线程(这是一种延迟实现的思想)

     

     */

    /*

     [self performSelectorInBackground:@selector(updata) withObject:nil];

     NSLog(@"主线程");

     //    这是一种隐式创建线程的方法,效果与第一种一样

     */

    

    /*

     线程之间的通讯

     

     performSelectorOnMainThread withObject:waitUntilDone:

     更新主线程

     

     performSelector:onThread:withObject:waitUntilDone:

     更新指定子线程

     */

    

    //    线程同步  线程锁

    //    NSCondition

    /*

    ticketNum = 100;

    condition = [[NSCondition alloc]init];

    

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

    thread1.name = @"thread1";

    [thread1 start];

    

    NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(act) object:nil];

    thread2.name = @"thread2";

    [thread2 start];

    

    NSThread *thread3 = [[NSThread alloc]initWithTarget:self selector:@selector(act) object:nil];

    thread3.name = @"thread3";

    [thread3 start];

*/

    

    

    

    

    

//    ---------------------------------------------

    

    self.view.backgroundColor = [UIColor blackColor];

    

    pointView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];

    pointView.backgroundColor = [UIColor whiteColor];

    pointView.layer.cornerRadius = 50;

    pointView.layer.masksToBounds = YES;

    [self.view addSubview:pointView];

    

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    [self.view addGestureRecognizer:tap];

    

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    button.frame = CGRectMake(10, 20, 100, 30);

    [button setTitle:@"下载图片" forState:UIControlStateNormal];

    [button addTarget:self action:@selector(loadData) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:button];

    

}

/*

- (void)act

{

    NSLog(@"%@",[NSThread currentThread]);

    while (ticketNum >= 0) {

        

        [condition lock];

        if(ticketNum >= 0){

            [NSThread sleepForTimeInterval:0.1];

            count = 100 - ticketNum;

            NSLog(@"当前票数是:%d,售出:%d,线程名:%@",ticketNum,count,[NSThread currentThread].name);

            ticketNum--;

        }

        [condition unlock];

        

    }

}

- (void)updata

{

    sleep(10);

    NSLog(@"子线程");

}

 

- (void)updata1

{

    sleep(5);

    NSLog(@"newThread子线程");

    [self performSelector:@selector(yayaya) onThread:newThread withObject:nil waitUntilDone:YES];

}

- (void)yayaya

{

    NSLog(@"执行");

}

*/

//普通

- (void)loadData

{

    NSLog(@"...");

    sleep(3);

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://file.bmob.cn/M01/33/41/oYYBAFXcMhaARlGBAABOZfJ7P6Y062.png"]];

    pointView.image = [UIImage imageWithData:data];

}

 

/*

//多线程

- (void)loadData

{

    NSLog(@"...");

    

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

    

}

 

- (void)commentData

{

    sleep(3);

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://file.bmob.cn/M01/33/41/oYYBAFXcMhaARlGBAABOZfJ7P6Y062.png"]];

    pointView.image = [UIImage imageWithData:data];

}

*/

 

- (void)tap:(UITapGestureRecognizer *)sender

{

    

    pointView.center = [sender locationInView:self.view];

}

 

 

 

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end

 

时间: 2024-10-12 13:07:47

多线程3的相关文章

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Spring多线程

Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务. 实例代码: (1)配置类 package com.lwh.highlight_spring4.ch3.taskexecutor; /**

python进阶学习(一)--多线程编程

1. 多线程 概念:简单地说操作系统可以同时执行多个不用程序.例如:一边用浏览器上网,一边在听音乐,一边在用笔记软件记笔记. 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务"一起"执行(实际上总有一些任务不在执行,因为切换任务的熟度相当快,看上去一起执行而已) 并行:指的是任务数小于等于CPU核数,即任务真的是一起执行的. 2. 线程 概念:线程是进程的一个实体,是CPU调度和分派的基本单位. threading--单线程执行: 1 import ti

多线程的实现及其安全问题

一.进程和线程概述 1.进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,简单来说开启一个程序就开启了一个进程: 如果开启多个进程,它们之间是由于CPU的时间片在相互的切换: 2.线程:开启一个进程的一个任务,对于多线程:每一个线程都在争夺CPU的执行权(CPU的执行权具有随机性): 如果一个程序的执行路径有多条,那么该线程是多线程;反之,就单线程线程:线程是依赖于进程存在的! 3.Jvm是多线程 -- 至少开启了两条线程 main方法 主线程 gc() 垃圾回收线程 二.多线程

多线程和多进程的区别与联系

1.单进程单线程:一个人在一个桌子上吃菜.2.单进程多线程:多个人在同一个桌子上一起吃菜.3.多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了...此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢. 1.对于 Windows 系统来说,[开桌子]的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜.因此 Windows 多线程学习重点

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

多线程(一)

这边来谈谈java中,我对对多线程的理解 在了解多线程前,先说说进程. 进程就是正在运行的应用程序.  当你打开任务管理器的时候,你就会发现很多的进程. 而我们要说的线程,就是依赖于进程而存在的,一个进程可以开启多个线程. Thread类 说到线程,就必须来说说Thread类. Thread类是说有线程的父类.具体请参见api 线程的创建以及执行(图解如下) 继承Thread类,或者实现rennable接口. 当继承了父类后,需要重写父类的run方法,这个run方法里面就写你要执行的代码,当这个

多线程下的单例-double check

话不多说直接上代码: public sealed class Singleton { private static Singleton _instance = null; // Creates an syn object. private static readonly object SynObject = new object(); Singleton() { } public static Singleton Instance { get { // Double-Checked Lockin

笔记:多线程

多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务,通常每个任务称为一个线程(thread),他是线程控制的简称,可以同时运行一个以上线程的程序称为多线程程序(multithreaded):多线程和多进程有哪些区别呢,本质的区别在于每个进程拥有自己的一整套变量,而线程则是共享数据,Java中启动一个线程的代码如下: // 线程任务的具体实现接口 ????public interface Runnable { public abstract void run(); ????} /

多线程

1.线程的概念? 多线程,就类似与操作系统中的多进程.简单的讲,就是可 以同时并发执行多个任务,处理多件事情.这与我们经常所 谓的边唱边跳,边说边做事一个道理.? 线程是一个轻量级的进程,一个进程中可以分为多个线程. 比起进程,线程所耗费的系统资源更少,切换更加容易 /* * 进程是操作系统中的一个任务,一个程序启动运行,就会创建 * 一个(或多个)进程. * 线程是轻量级的进程.进程会有自己独立的内存空间与资源.一个进程 * 下会存在一个(或多个)线程.线程为进程的执行单元.线程本身不含有 *