栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java并发编程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java并发编程

一、使用Executors工厂类创建线程池
Executors.newCachedThreadPool() //创建一个无边界的线程池
Executors.newFixedThreadPool(int) //创建一个有边界的线程池
Executors.newSingleThreadExecutor() //创建单一线程池
二、ThreadPoolExecutor的使用

构造方法:ThreadPoolExecutor(int corePoolSize,int MaximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueworkQueue)

运行存在的情况
(1) if A<=B 直接创建线程,不放到扩展队列Queue中。
(2) if A>B&&A<=C&&E C和G参数被不起作用,D会被放在E中等待,不会立即创建线程,会等待核心线程空闲出来。
(3) if A>B&&A<=C&&F C和G起作用,会马上创建线程运行,创建后的线程活跃时间到了,就会销毁,只留下核心线程
(4) if A>B&&A> C&&E C和G参数被不起作用,D会被放在E中等待,不会立即创建线程,会等待核心线程空闲出来。
(5) if A>B&&A> C&&F C和G起作用,处理C的任务,其他任务不再创建抛出异常
停止线程池的函数

shutdown()与shutdownNow()
shutdown()的作用是在关闭时会执行未执行完的线程
shutdownNow()会中断所有的任务

三、并发集合框架

线程不安全的集合

1.List集合是非线程安全的
2.Vector是线程安全的链表
3.HashSet是线程不安全的
4.Queue队列 Deque双端队列

线程安全的集合

非阻塞队列
Hashtable  --->代替hashMap  不支持使用iterator是改变其结构
ConcurrentHashMap    ---> 支持使用iterator是改变其结构,不支持排序
ConcurrentSkipListMap      --->支持排序
ConcurrentSkipListSet
ConcurrentlinkedQueue
ConcurrentlinkedDeque
CopyOnWriteArrayList
CopyOnWriteArraySet
阻塞队列
AarryBlockingQueue 有界阻塞队列
PriorityBlockingQueue 支持并发情况下的优先级队列
SynchronousQueue 异步阻塞队列,每个插入操作必须等待另一个线程对应的移除操作,经常在多线程中传输数据时使用
四、Futrue与Callable的使用 使用方法
使用get()结合ExecutorService中的submit(Callable)来使用,部分代码如下:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2,3,5L,TimeUnit.SECONDS,new linkedBlockingDeque());
Future future = executor.submit(callable);
future.get(); //获取线程运行得到的数据 它如果得不到数据就会阻塞在这里 
future.get(long timeout,TimeUnit unit)  //设置最大等待时间

ExecutorService中submit(Runnable,T result),第二个参数result可以作为执行结果的返回值,而不需要使用get()方法进行获得
五、CompletionService的使用

它的功能是以异步的方式一边生成新的任务,一边处理已完成任务的结果,这个可以将执行任务与处理任务分离开来进行处理。使用submit执行任务,使用take取得已处理的任务,并按照完成执行任务的时间顺序处理他们的结果

部分代码
MyCallable callable1 = new MyCallable(....);
MyCallable callable2 = new MyCallable(....);
MyCallable callable3 = new MyCallable(....);
MyCallable callable4 = new MyCallable(....);
MyCallable callable5 = new MyCallable(....);
List callableList = new ArrayList();
callableList.add(callable1);
callableList.add(callable2);
callableList.add(callable3);
callableList.add(callable4);
callableList.add(callable5);
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,5L,TimeUnit.SECONDS,new linkedBlockingDeque());
CompletionService scRef = new ExecutorCompletionService(executor);
for(int i = 0;i < 5; i++){
	scRef.submit(callableList,get(i));
}
for(int i = 0; i<5; i++){
	System.out.println(csRef.take().get());
}
代码性能
使用了CompletionService后,那个任务先执行完,就先打印那个任务的结果。
如果当前没有任务被执行完,则scRef.take().get()方法还是呈阻塞态
六、Semaphore与CountDownLatch、CyclicBarrier和Phaser的使用

都是对synchronized的升级,可以控制线程并发数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号