
多线程
IamOceanKing
这个作者很懒,什么都没留下…
展开
-
合理地配置线程池
要想合理地配置线程池,就必须首先分析任务特性,可以从以下几个角度来分析。 任务的性质:CPU密集型任务、IO密集型任务和混合型任务。 任务的优先级:高、中和低。 任务的执行时间:长、中和短。 任务的依赖性:是否依赖其他系统资源,如数据库连接。 性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务应配置尽可能小的线程,如配置Ncpu+1个线程的线程池。由于IO密原创 2017-03-17 14:54:25 · 894 阅读 · 0 评论 -
多线程基础杂谈
Daemon:(守护)线程主要用于程序中后台调度以及支持性工作,如垃圾回收线程等。当JVM中仅剩下Daemon线程时,JVM将会退出。 Thread:定义线程对象时,应给其指定名称,方便分析和排查问题。线程对象初始化时,部分属性默认来自于当前线程,即父前程,如优先级、群组、daemon等。 public static void main(String[] args) throws Inter原创 2017-03-09 14:52:16 · 340 阅读 · 0 评论 -
初识多线程
1. 为啥要用多线程?多线程是为了让程序运行得更快2. 线程越多越快吗?不是,因为多线程创建、上下文切换会影响执行速度。每个线程都有自己的Stack,Java在64位系统默认Stack大小是1024KB3.如何减少线程的创建?利用线程池4.如何减少上下文切换?A、多线程竞争锁时,会引起上下文切换,可以采用三种方式避免锁的使用: ThreadLocal:单个线程独享数据 无锁并发编原创 2017-03-07 10:44:08 · 301 阅读 · 0 评论 -
CAS肤浅析
以下内容纯属个人通俗理解,如有准确或正确,纯属巧合!CAS(Compare and Swap):这是一个非阻塞式保证原子操作的设计方案。字面意思是比较并且交换,和谁比较?那设置(交换我就理解为设置)什么?原子操作:值在整个操作过程中,不会发生修改非阻塞式:不会因为等待获取锁而发生线程切换比较:用面向过程的方式叙述,第一步:先获取当前时刻的值,第二步,和当前时刻的值比较。虽然都是当前时刻的值,但是两个原创 2017-03-08 15:09:38 · 338 阅读 · 0 评论 -
synchronized与Lock比对
Lock:可以显示指定起始位置和终止位置,提高了可操作性可中断的获取锁【lock.lockInterruptibly()】:当线程在等待获取锁时,如果调用interrupt(),则会抛出InterruptedException 中断锁等待超时锁【tryLock(…)】:可以设定锁的等待超时时间(不设置时立即返回结果true/false),超时后,中断等待。Lock用的是乐观锁方式:所谓乐观锁原创 2017-03-10 15:41:26 · 291 阅读 · 0 评论 -
实现自己的原子对象
package mytest;import java.util.concurrent.atomic.AtomicInteger;public class MyAtomicOperation extends AtomicInteger { private static final long serialVersionUID = 9158143849502838333L; private原创 2017-03-23 11:45:28 · 473 阅读 · 0 评论 -
TransferQueue
–摘录 Java 7中的TransferQueue 原文链接,译文链接,作者:Alex Miller,译者:Greenster,校对:梁海舰 Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue和其实现类LinkedTransferQueue。 TransferQueue继承了BlockingQueue(Block原创 2017-03-22 16:31:33 · 746 阅读 · 0 评论 -
定制并发类
定制ThreadPoolExecutor ,覆盖相关方法package mytest;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Callable;imp原创 2017-03-22 11:50:38 · 385 阅读 · 0 评论 -
ForkJoin
package mytest;import java.io.File;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurr原创 2017-03-20 17:26:42 · 409 阅读 · 0 评论 -
线程池
本文纯属个人理解,如有正确,纯属巧合线程池原理:提交任务后,如果发现当前“已经new的线程”小于corePool,即使有空闲的线程存在,也new个新的线程执行该任务。否则,将其加入BlockingQueue队列中,等待已有的线程“循环”去执行队列中的任务,如果此时队列也满了,则需要再次判断当前“已经new的线程”是否小于maximumPoolSize,如果小于,则新建线程;否则,根据拒绝策略进行处理原创 2017-03-16 15:08:09 · 354 阅读 · 0 评论 -
synchronized肤浅析
任意一个对象都有自己的监听器,听说是在一个什么头里面。当这个对象由同步块或者这个对象的同步方法调用时,执行方法的线程必须先获取到该对象的监视器Monitor才能进入同步块或者同步方法,而没有获取到监视器的线程会被阻塞在同步块和同步方法的入口处,即进入同步队列,线程状态变为BLOCKED状态。当前获取监视器的对象释放锁后,会唤醒阻塞在队列中的线程。参考:Java并发包中的同步队列Synchronou原创 2017-03-09 17:47:59 · 282 阅读 · 0 评论 -
等待/通知机制:wait/notify
wait-notify简介:程序测试:public class WaitNotify { static boolean flag = true; static Object lock = new Object(); public static void main(String[] args) throws InterruptedException { Threa原创 2017-03-10 11:29:53 · 493 阅读 · 0 评论 -
Future
Future:获得线程执行结果package mytest;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import ja原创 2017-03-17 11:39:18 · 416 阅读 · 0 评论 -
shutdown与shutdownNow
引自《Java并发编程的艺术》 可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。它们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shut原创 2017-03-16 18:48:31 · 724 阅读 · 0 评论 -
篱栅:CyclicBarrier
塞克丽克 百瑞尔package mytest;import java.util.Map.Entry;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CyclicBarrier;import j原创 2017-03-15 18:43:13 · 373 阅读 · 0 评论 -
信号量:Semaphore
无场景不成方圆 应用场景1:用于做流量控制,特别是公用资源比较有限的场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则就会报无法获取数据库连接。这个时候,就可以用Semaphore来做流量控制。应原创 2017-03-15 10:45:51 · 369 阅读 · 0 评论 -
线程组:ThreadGroup
线程组的作用还是挺大的!!package mytest;import java.util.Date;import java.util.Random;import java.util.concurrent.TimeUnit;public class ThreadGroupTest { static class MyThreadGroup extends ThreadGroup {原创 2017-03-14 11:16:52 · 794 阅读 · 0 评论 -
线程中不可控异常处理
package mytest;import java.lang.Thread.UncaughtExceptionHandler;public class ExceptionHandler implements UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e)原创 2017-03-14 11:15:45 · 409 阅读 · 0 评论 -
Join肤浅析
join()这个方法是插入到父线程之前执行,此时父线程处于WAITING状态,只有当join的插队线程执行完了,父线程才恢复运行状态!对于同一时刻运行的其他线程,join不起到任何作用!package mytest;import java.util.concurrent.TimeUnit;public class JoinTest { static class DataSourcesLoad原创 2017-03-14 10:25:24 · 304 阅读 · 0 评论 -
线程->锁->Condition肤浅析
Condition对象是由Lock对象创建出来的,其功能同wait/notify(换成了await/signal)差不多,但他的优势所在之处,就是他可以指定唤醒的对象,也就是说作用力度更细。此外,当线程释放锁进入等待状态时,不会响应中断! 最后粘贴参考中的一段话: 这就是多个Condition的强大之处,假设缓存队列中已经存满,那么阻塞的肯定是写线程,唤醒的肯定是读线程,相反,阻塞的肯定是读线原创 2017-03-13 18:31:19 · 689 阅读 · 0 评论 -
ReentrantReadWriteLock肤浅析
ReentrantReadWriteLock肤浅析原创 2017-03-13 18:02:24 · 297 阅读 · 0 评论 -
并发集合:ConcurentLinkedDeque
阻塞式集合:这类集合包括添加和移除数据的方法。当集合已满或者为空时,被调用的添加或者移除方法不能立即被执行,那么调用这个方法的线程被阻塞,一直到该方法可以被成功执行。 非阻塞式集合:这类集合也包括添加和移除数据的方法。如果方法不能立即被执行,则返回null或抛出异常,但调用这个方法的线程不会被阻塞。看看下面非阻塞式的一个:ConcurentLinkedDequepackage mytest;imp原创 2017-03-21 11:18:35 · 733 阅读 · 0 评论