线程

iOS多线程的初步研究(三)-- NSRunLoop

假装没事ソ 提交于 2020-03-20 03:02:46
弄清楚 NSRunLoop确实 需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜)。 官网的解释是说run loop可以用于处理异步事件,很抽象的说法。不罗嗦,先看看NSRunLoop几个常用的方法。 + ( NSRunLoop *)currentRunLoop; //获得当前线程的run loop + (NSRunLoop *)mainRunLoop; //获得主线程的run loop - ( void )run; //进入处理事件循环,如果没有事件则立刻返回。注意:主线程上调用这个方法会导致无法返回(进入无限循环,虽然不会阻塞主线程),因为主线程一般总是会有事件处理。 - ( void )runUntilDate:( NSDate *)limitDate; //同run方法,增加超时参数limitDate,避免进入无限循环。使用在UI线程(亦即主线程)上,可以达到暂停的效果。 - ( BOOL )runMode:( NSString *)mode beforeDate:( NSDate *)limitDate; //等待消息处理,好比在PC终端窗口上等待键盘输入。一旦有合适事件(mode相当于定义了事件的类型)被处理了,则立刻返回;类同run方法,如果没有事件处理也立刻返回;有否事件处理由返回布尔值判断

李洪强经典面试题145-Runloop

社会主义新天地 提交于 2020-03-20 02:11:38
李洪强经典面试题145-Runloop Runloop 什么是 Runloop? 从字面上讲就是运行循环。 它内部就是do-while循环,在这个循环内部不断地处理各种任务。 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop 基本的作用就是保持程序的持续运行,处理app中的各种事件。通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。 Runloop对象 iOS中有2套API来访问和使用RunLoop Foundation:NSRunLoop Core Foundation:CFRunLoopRef NSRunLoop和CFRunLoopRef都代表着RunLoop对象 NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API。 Runloop与线程 每条线程都有唯一的一个与之对应的RunLoop对象 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建 RunLoop在第一次获取时创建,在线程结束时销毁

IOS开发之多线程NSThread

倾然丶 夕夏残阳落幕 提交于 2020-03-20 01:57:17
一、什么是多线程 NSThread是轻量级的多线程开发,使用并不复杂,但使用NSThread需要自己管理线程的生命周期,这篇文章主要讲NSThread的使用 了解进程与线程 1. 线程是CPU执行任务的基本单位,一个进程能有多个线程,但同时只能执行一个任务 2. 进程就是运行中的软件,是动态的 3. 一个操作系统可以对应多个进程,一个进程可以有多条线程,但至少有一个线程 4. 同一个进程内的线程共享进程里的资源 2. 主线程 1. 进程一启动就自动创建 2. 显示和刷新UI界面 3. 处理UI事件 3. 子线程 1. 处理耗时的操作 2. 子线程不能用来刷新UI NSThread常用方法 使用NSThread开辟线程的两种方式: 创建并手动开启线程 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(compete) object:nil]; [thread start]; 创建并自动开启线程 [NSThread detachNewThreadSelector:@selector(compete) toTarget:self withObject:nil]; 判断当前进程是否是多线程 BOOL isMultiThread = [NSThread isMultiThreaded];

iOS-NSThread多线程

*爱你&永不变心* 提交于 2020-03-20 01:52:35
NSThread 一、创建和启动线程 一个NSThread对象就代表一条线程 创建方法一: 优点:可以对线程进行更多的设置 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 //设置名字 - (void)setName:(NSString *)n; - (NSString *)name; 创建方法二 创建线程后自动启动线程 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 或者 //隐式创建并启动线程 [self performSelectorInBackground:@selector(run) withObject:nil]; 上述2种创建线程方式的优缺点 + 优点:简单快捷,不用手动调用start方法, 系统会自动启动 + 缺点:无法对线程进行更详细的设置 二、相关使用方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 +

【线程锁 Synchronized与ReentrantLock 示例】

萝らか妹 提交于 2020-03-20 00:13:25
前言: 之前一直对线程锁不理解,去网上找了很多讲解Synchronized关键字和ReentrantLock的帖子,大致了解了用法,写个小程序记录一下。有不足和错误欢迎留言评论,大家一起学习进步。 一、为什么要用线程锁 Java多线程同时处理任务会显著提高工作效率。但是,如果多个线程同时操作某一资源,可能会导致数据的不同步,引发错误。因此对于某些资源我们要对线程进行控制,同一时间只允许单个线程进行操作。这时我们就需要使用线程锁。 场景: 书店生产书,直到书总量达到10本,顾客买书,总共要买10本 书店:书店只要书不足10本就一直生产,直到书店内书个数达到10,停止生产,如果此时有书被顾客买走就继续生产,直至存货10本... 顾客:只要书店有书就从书店购买,没有书就停止购买,等有书产出就继续,直到购买10本 二、Synchronized关键字实现线程锁 书店: public class SynchronizedProviderThread extends Thread { public static List<String> books=new ArrayList<String>(); public static int MAX_BOOK_NUM=10; public void run(){ try{ while(!Thread.interrupted()){

java线程(2)--同步和锁

醉酒当歌 提交于 2020-03-20 00:11:24
参考转载:http://rainyear.iteye.com/blog/1734311 http://turandot.iteye.com/blog/1704027 http://www.cnblogs.com/fguozhu/articles/2657904.html http://lavasoft.blog.51cto.com/62575/99155 http://www.cnblogs.com/dolphin0520/p/3923167.html 1.线程的内存模型 Java作为平台无关性语言,JLS(Java语言规范)定义了一个统一的内存管理模型 JMM (Java Memory Model),JMM屏蔽了底层平台内存管理细节,在多线程环境中必须解决可见性和有序性的问题。JMM规定了jvm有 主内存 (Main Memory)和 工作内存 (Working Memory) ,主内存存放程序中所有的类实例、静态数据等变量,是多个线程共享的,而工作内存存放的是该线程从主内存中拷贝过来的变量以及访问方法所取得的局部变量,是每个线程私有的其他线程不能访问,每个线程对变量的操作都是以先从主内存将其拷贝到工作内存再对其进行操作的方式进行,多个线程之间不能直接互相传递数据通信,只能通过共享变量来进行。 重要的图片看三遍,从三个内存模型的文章中摘出的图片含义是一致的。即: 1

JAVA线程锁-读写锁

我只是一个虾纸丫 提交于 2020-03-20 00:11:07
  JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock   其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 * * @author * * * */ public class ReadWriteLockTest { public static void main(String[] args) { final Operation operation = new Operation(); for (int i = 1; i <= 3; i++) { new Thread(new Runnable() { @Override public void run() { operation.getData(); } }).start(); new Thread(new Runnable() { @Override public void run() { operation.putData(new Random().nextInt(1000)); } }).start(); } } } class Operation{ private ReadWriteLock rwl = new ReentrantReadWriteLock();

java线程基础知识----线程与锁

非 Y 不嫁゛ 提交于 2020-03-20 00:10:28
  我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁。   1.  首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的是java的顶层类,所有的类都集成自Object类,包括string和数组。而且每一个Object都有一个锁,同一时间只能有一个线程暂用这个对象的锁。这是我们今天学习的前提条件,至于Object的一些方法我们在后面的章节中会进行学习。   2.  java锁之synchronized: 想必大家都知道java的synchronized关键字,在我看来这是锁操作中相对简单的方法,但是对事物我总有一个定义“简单的就是可扩展性差的”,下面我们将了解synchronized关键字的用法: A. 入门基础实例: 举一个经典的售票例子,就是同时有2个窗口售票(当然是电子票),而且票的数量是一定的,假设20张。两个窗口之间售票相互独立。我们应该怎么实现? public class ThreadTest { public static void main(String[] args) throws InterruptedException{ Thread1 thread1 = new Thread1(); Thread threadA = new Thread(thread1);

Java多线程深入理解

眉间皱痕 提交于 2020-03-19 09:15:06
在 java中要想实现多线程,有两种手段,一种是继续 Thread类,另外一种是实现 Runable接口。 对于直接继承 Thread的类来说,代码大致框架是: class 类名 extends Thread{ 方法1; 方法2; … public void run(){ // other code… } 属性1; 属性2; … } 先看一个简单的例子: /** * @author Hashsound 继承Thread类,直接调用run方法 * */ class hello extends Thread { private String name; public hello() { } public hello(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i); } } public static void main(String[] args) { hello h1 = new hello("A"); hello h2 = new hello("B"); h1.run(); h2.run(); } } 【运行结果】: A运行 0 A运行 1 A运行 2 A运行 3 A运行 4 B运行 0

进程与线程(一)(基本定义和demo)

≡放荡痞女 提交于 2020-03-19 07:26:32
线程和进程 进程定义 进程指正在运行的程序 确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。(比如电脑中运行的酷狗,qq等) 线程定义 线程是进程中的一个执行单元,负责当前进程中程序的执行,线程共享进程的资源。 线程与进程的关系 一个程序运行后至少有一个进程,一个进程中可以包含多个线程。 主线程 jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。 多线程定义 即就是一个程序中有多个线程在同时执行。多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。提到多线程就要提到两个概念:串行/并行 串行 单个线程执行多个任务。比如下载文件,第一个没下完不能开始下载第二个,属于不同时刻。缺点很明显,效率很低。 并行 多个线程执行多个任务。比如开启迅雷同时下载好几个文件,属于同一时刻。效率很高,但是要注意不要每个任务都建一个线程去处理,任务数量越多,内存压力越大,严重会导致宕机。 程序运行原理 分时调度 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。 抢占式调度 优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个线程(线程随机性),java使用的为抢占式调度。 使用线程和不适用线程的区别