线程阻塞

对线程池简单理解

爷,独闯天下 提交于 2020-03-20 03:04:03
线程池的好处: 1,因为线程是比较昂贵的资源,避免大量重复创建销毁线程,使用者不用关心创建销毁线程。 2,用户提交的任务能够及时的得到处理,提高响应速度。 3,能够更好的监控和管理线程。 ThreadPoolExecutor参数 int corePoolSize 线程池基本大小 int maximumPoolSize 线程池最大大小 long keepAliveTime 保持活动时间 TimeUnit unit 保持活动时间单位 BlockingQueue workQueue 工作队列 ThreadFactory threadFactory 线程工厂 RejectedExecutionHandler handler 驳回回调 这些参数这样描述起来很空洞,下面结合执行任务的流程来看一下。 ThreadPoolExecutor执行任务流程 当线程池大小 >= corePoolSize 且 队列未满时,这时线程池使用者与线程池之间构成了一个生产者-消费者模型。线程池使用者生产任务,线程池消费任务,任务存储在BlockingQueue中,注意这里入队使用的是offer,当队列满的时候,直接返回false,而不会等待。 keepAliveTime 当线程处于空闲状态时,线程池需要对它们进行回收,避免浪费资源。但空闲多长时间回收呢,keepAliveTime就是用来设置这个时间的。默认情况下

多线程 NSThread

霸气de小男生 提交于 2020-03-20 03:03:47
多线程 NSThread 创建和启动线程 一个NSThread对象就代表一条线程 创建、启动线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程 其他用法 获得当前线程 NSThread *current = [NSThread currentThread]; 线程的调度优先级 + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; - (double)threadPriority; - (BOOL)setThreadPriority:(double)p; 调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 线程的名字 - (void)setName:(NSString *)n; - (NSString *)name; 其他创建线程方式

java 基础--<线程池>

走远了吗. 提交于 2020-03-20 03:03:07
1.接口 Executor void execute(Runnable command) 在未来某个时间执行给定的命令。 2.接口 public interface ExecutorService extends Executor submit(Runnable task) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 submit(Callable<T> task) 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 invokeAll(Collection<? extends Callable<T>> tasks) 执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。 shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。 List<Runnable> shutdownNow() 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。 3.接口public interface ScheduledExecutorService extends ExecutorService 一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。 4,抽象类public abstract class

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方法,如果没有事件处理也立刻返回;有否事件处理由返回布尔值判断

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; // 是否为主线程 +

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线程基础知识----线程与锁

非 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);

并发编程的艺术02-过滤锁算法

 ̄綄美尐妖づ 提交于 2020-03-19 20:12:26
3 月,跳不动了?>>> 导读 分析并发计算的实质就是分析时间。有时候希望事件同时发生,有时候希望事件在不同时间发生。— 《多处理器编程的艺术》 本章内容会介绍一种互斥锁算法也就是标题中所说的过滤锁算法,虽然它在实际应用中可能并不实用,但却是一种经典算法。掌握这些算法将会有助于你对并发,互斥,死锁,饥饿的理解。 互斥 mutual exclusion 在多线程环境中 所有线程共享一个共同的时间。一个线程是一个状态机,而它状态的转换称为事件。 事件是瞬时的,它们在单个瞬间发生。 在并发编程中互斥是指在同一时刻,至多只能有一个线程进入临界区内,这样的特性称为互斥 。如果并发执行的程序没有互斥特性,将会无法保障计算结果的正确性。 所以说互斥是一种安全特性 。为了直观的便于大家理解,下面会举一个生活中的例子说明互斥特性。 上图是一辆和谐号动车正在一条铁轨上行驶, 很显然在同一时刻这条铁轨的某一段中最多只能允许一辆列车在上面行驶,这就是互斥特性的体现。如果说在某一时刻这条铁轨的同一段中出现了两辆列车都在行驶,那么就会产生安全问题,这体现了互斥的安全特性 。对上面这个模型进行抽象, 时间是永远不会改变且不会受外界影响的,行驶的和谐号列车可以看作是一个运行的线程,而这条铁轨的某一段可以看作临界区 在并发编程当中与互斥特性密切相关的还有 无死锁 , 无饥饿 两个重要特性。聪明的读者应该已经想到了

并发工具类和线程池

…衆ロ難τιáo~ 提交于 2020-03-19 17:53:22
工具类 CountDownLatch 利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 package com.yjc.juc; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { System.out.println("主线程启动---->等待子线程执行完毕"); //代表等待两个线程执行完主线程才继续执行 CountDownLatch countDownLatch=new CountDownLatch(2); new Thread(() -> { System.out.println("第一个子线程" + Thread.currentThread().getName() + "正在执行"); countDownLatch.countDown(); System.out.println("第一个子线程" + Thread.currentThread().getName() + "执行完毕"); }).start(); new Thread(