Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到线程安全问题.如果你认为只会在单任务线程的Executor中运行的话,从设计上讲这就已经耦合了. 3,长时间的任务有可能会影响到其他任务的执行效率,可以让其他线程在等待的时候限定一下等待时间.不要无限制地等待下去. 确定线程池的大小 给出如下定义: 要使CPU达到期望的使用率,线程池的大小应设置为:…
任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任务都要等待处理.响应性很糟糕,吞吐量低.系统资源利用率低. 2.显示的为任务创建线程 为每个任务创建对应一个线程,响应快,系统资源利用路高.缺点是资源消耗量大,如果有大量任务要执行的话,系统迟早会因为无限制创建过多的线程而造成内存耗尽.特别当创建的线程数量远远大于系统的CPU核数,由于每一个核同一时…
类似于Web服务器这种多任务情况时,不可能只用一个线程来对外提供服务.这样效率和吞吐量都太低. 但是也不能来一个请求就创建一个线程,因为创建线程的成本很高,系统能创建的线程数量是有限的. 于是Executor就出现 了. Executor框架 线程池的意义 线程创建太少了浪费服务器资源,另外线程创建多了又搞得服务器很累.两个极端的结果都是对外的吞吐量上不去. 所以线程是需要统一管理的,不能随便new Thread().start(). Executor提供了四种线程池. ExecutorServ…
2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的例子,多线程状态下的i++是不安全的.因为i++其实是分很多步骤实现的,多个线程的执行过程可能会相互混乱. 竞态条件(Race Conditions) 线程与线程之间需要依赖于执行顺序来保证执行结果的正确性.那么就会发生竞态条件.例如在A线程中设置一个值,然后通过另外一信号变量通知给另外一个线程来读.这种协调…
同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到,它的绝大部分方法都被加了同步(带个小时钟图标). 虽然Vector这么劳神费力地搞了这么多同步方法,但在最终使用的时候它并不一定真的"安全". 同步容器的复合操作不安全 虽然Vector的方法增加了同步,但是像下面这种"先检查再操作"复合操作其实是不安全的: //两个同…
任务的取消 中断传递原理 Java中没有抢占式中断,就是武力让线程直接中断. Java中的中断可以理解为就是一种简单的消息机制.某个线程可以向其他线程发送消息,告诉你“你应该中断了”.收到这条消息的线程可以根据这个消息做出反应. 意思是,不是你说让我停我就会停,我愿意停就停! 中断消息的传递其实就是通过Thread的一个布尔类型中断状态变量实现的. 发送中断请求时,线程的中断变量被设置为true: Thread t = new Thread(new Runnable() { @Override…
Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池的操作,来缓存我们并发操作的线程. 而对于java中的线程池,大家需要理解好ThreadPoolExecutor.AbstractExecutorService.ExecutorService和Executor这几个类之间的关系即可. 通过看上面的这个关系图,可以知道,最核心的一个类是ThreadP…
Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 SynchronousQueue的双向形式.Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用. 二.算法描述 基本想法是维护一个槽指向一个结点,结点包含一个准备提供(出去)的item和一…
关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个逸出的引用访问到“初始化了一半”的对象(partially-constructed object).这样就会出现某些线程中看到该对象的状态是没初始化完的状态,而在另外一些线程看到的却是已经初始化完的状态,这种不一致性是不确定的,程序也会因此而产生一些无法预知的并发错误.在说明并发编程中如何避免this引用逸出…
一.在任务与运行策略之间的隐性解耦 有些类型的任务须要明白地指定运行策略,包含: . 依赖性任务.依赖关系对运行策略造成约束.须要注意活跃性问题. 要求线程池足够大,确保任务都能放入. . 使用线程封闭机制的任务.须要串行运行. . 对响应时间敏感的任务. . 使用ThreadLocal的任务. 1. 线程饥饿死锁 线程池中假设全部正在运行任务的线程都因为等待其它仍处于工作队列中的任务而堵塞.这样的现象称为线程饥饿死锁. 2. 执行时间较长的任务 Java提供了限时版本号与无限时版本号. 比如T…