- 浏览: 243361 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
bit1129:
huanjia27 写道楼主, //数字小,优先级高 ...
PriorityBlockingQueue优先级规则 -
huanjia27:
楼主, //数字小,优先级高 public in ...
PriorityBlockingQueue优先级规则 -
bit1129:
优先级队列有点坑。。。对于返回的数组或者Iterator,对它 ...
PriorityBlockingQueue优先级规则 -
sun_2008:
再加一个参数cachePrepStmts=true才行,好像预 ...
Mysql是支持预编译的,只是默认没开启 -
hooray520:
nice~~
ThreadPoolExecutor线程池实现逻辑
前面对并发编程,我一直是心怀崇敬,如履薄冰。尽管如此,稍微复杂一点的并发任务,就搞的焦头烂额。现整理一些学习笔记,以便随时记录,随时巩固。
//该线程池是个可以回收利用的线程池,按需产生线程,可以被复用,线程可以闲置60秒,或者被销毁 //一般多线程程序,首选该线程池 public static void testCachedThreadPool(){ ExecutorService se=Executors.newCachedThreadPool(); for(int i=0;i<4;i++){ se.execute(new LiftOff()); } //shutdown的作用是避免提交更多的线程任务 se.shutdown(); } //该线程池产生固定个数的线程,并复用,不被销毁。 //好处是线程个数有限,即便是糟糕的程序也不能滥用资源 public static void testFixedCacheThreadPool(){ ExecutorService se=Executors.newFixedThreadPool(2); se.execute(new LiftOff()); for(int i=0;i<4;i++){ se.execute(new LiftOff()); } } /** * 1.该线程池只产生一个不停止的线程,每次调用线程任务都会等待上一次的任务完成 * 比如写日志的模块,为了避免主程序等待IO操作,可以传入一个ExecutorService,写日志的时候就向这个线程池 * 的队列添加一个日志任务 * * 2.监听socket的任务,比如发送短信。短信的网关只有1个Socket出口,也就是同时只能发1条信息。但是界面提交信息数可能 * 在某一时间大量任务,那么这时候可以采用这个线程池,让所有的任务进行排队。而不是在socket出口上对资源进行锁定。 * 避免了在资源同步上繁琐的处理。 * * 3.事件分发线程,响应事件的时候,采用同一接口分发事件。各个时间按照抛出的先后顺序排队,然后按次序分发 * * 某种意义上讲,这是一个单队列任务,大量线程任务使用同一资源时很有效 */ public static void testSingleThreadExecutor(){ ExecutorService se=Executors.newSingleThreadExecutor(); for(int i=0;i<4;i++){ se.execute(new LiftOff()); } } /** * 1.Callable返回的值可以是任意类型 * 2.采用ExecutorService.submit方法来执行 * 3.Callable的Cancel必须在还未调用get方法的时候调用,不然cancel不了。 * 4.isDone方法可以判断是否有返回结果了 * 5.get方法是个同步的方法,会一直等待返回结果,然后退出 */ public static void testCallableThread(){ ExecutorService se=Executors.newCachedThreadPool(); Future<Integer> f1=se.submit(new LiftOffCallable()); //f1.cancel(true); System.out.println(f1.isCancelled()); System.out.println(f1.isDone()); try { //System.out.println(f1.get()); System.out.println(f1.isDone()); System.out.println(f1.isCancelled()); f1.cancel(true); System.out.println(f1.isCancelled()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } se.shutdown(); } /** * sleep与yield的相同点在于, 都会让当前线程放弃cpu,让其他线程执行。 * sleep在指定的时间后才能执行, yield则不预见什么时候能执行 * * sleep的机制在不同的平台实现有所不一样,尽量不要用。很多情况下,可以采用wait,或者yield来实现类似功能: * 1.比如不断查询某个结果是否有值 * 2... * * wait不能和这2个混淆,不能因为名字也一样短,就认为有什么共同点 * * TimeUnit提供了操作线程状态的几个简略方法: TimeUnit.MILLISECONDS. */ public void testSleep(){ while(true){ try { TimeUnit.MILLISECONDS.timedJoin(new Thread(), 110l); TimeUnit.MILLISECONDS.timedWait(new Object(), 110l); TimeUnit.MILLISECONDS.sleep(10l); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /* * 通常情况,操纵优先级都是一种错误 * 应该在run方法的开始部分设置,构造器里面设置没有什么好处 * JDK有10个优先级,真正所有系统都支持的只有3个,MAX,MIN,NORM * * volatile定义的变量,不能进行任何编译器优化 */ public void testThreadPriority(){ Thread.currentThread().setPriority(1); } /* * yield能够促使各种不同的任务之间,产生良好的处理机制,除此之外,不能作其他用处 * * 需要注意的,我们的程序逻辑,不能依赖这个机制 */ public void testYield(){ Thread.yield(); } /* * Daemon是后台线程,只要还有非后台线程存在,那么Daemon就不会停止 * Daemon提供的是通用服务线程,但它不是必不可少的部分 * * * Daemon线程是为其他线程服务的,并不是程序的本地,比如说垃圾回收机制,当所有的线程都 * 运行完毕,垃圾回收Daemon才会停止。 * * 比如在main里面创建一系列后台线程,当main结束时候,所有后台线程也结束了 * * 不要再构造方法里面启动线程,这样有可能构造还没有结束就开始线程了,所以总是用Executor.execute来执行线程 */ public void testDaemon(){ new Daemon(); } /* * 创建同种特性的线程,可以只用ThreadFactory定义一次 * 比如,创建一批Daemon线程,都拥有最大的priority */ public void testThreadFactory(){ ExecutorService se=Executors.newSingleThreadExecutor(new ThreadFactory(){ public Thread newThread(Runnable r) { Thread t=new Thread(r); t.setDaemon(true); t.setPriority(Thread.MAX_PRIORITY); return t; } }); } /* * 1.调用join的需求是,希望在某个线程中执行到一部分的时候,转入另外一个指定的线程,而当前 * 2.线程挂起,等到另外一个线程执行完了以后,再恢复到到join的点,然后执行下去 * 3.注意,join的必须是正在运行的线程,还未启动的线程,join的时候不会启动 * 4.join的参数,指定一定得时间,如果还未返回,那么就自动结束挂起 * 5.join可以被interrupt, 比如: 如果一个线程,join后长时间等待后,还没有返回结果,那么在其他线程里面调用这个线程的interrupt,可以结束join等待,继续执行下去 * 6.网上有人说interrupt害人,应该是没有搞清楚interrupt的用处,没有测试,从字面意思理解为(结束,或者关闭) * 真实的意思,应该是让线程结束某个等待,然后顺利执行下去 * 7.如果是Executor执行的Thread,那么join后,将不能够interrupt */ public static void testThreadJoin(){ class TestJ extends Thread{ public TestJ(){ //必须是join正在运行的线程 start(); } public void run() { int i=10; while(i-->0){ try { TimeUnit.MILLISECONDS.sleep(500l); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("XXX"); } } } Thread tx=new TestJ(); class TestJ1 extends Thread{ Thread t; public TestJ1(Thread tx){ t=tx; } public void run() { int i=10; while(i>0){ if(i==5){ try { t.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Integer.toString(i--)); } } } ExecutorService se=Executors.newCachedThreadPool(); Thread xx=new TestJ1(tx); se.execute(xx); //xx.start(); try { TimeUnit.MILLISECONDS.sleep(1000l); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } xx.interrupt(); }
发表评论
-
提高Fusion开发效率的几个技巧
2012-05-29 12:29 10821. 整理自己的所做过的B ... -
Oracle ADF 学习笔记 -- Entity Object
2011-10-07 23:57 5256通过这个把月的接触, ... -
finally关键字与return关键字的关系
2011-03-15 17:26 1296finally关键字与return关键字的关系 1. fi ... -
采用泛型,自己实现一个Stack
2010-12-12 12:26 997实现思路: 1.建立一个结点,每个结点都有一个保存自身val ... -
关于类的equals和hashcode方法
2010-12-06 22:21 1078当我们想要改写equals方法的时候,总是应该打起12分的精神 ... -
获取字符组所有排列字符串的算法
2010-12-04 09:43 1598刚看了论坛上有个很有意思的递归算法题,忍不住自己也动手来写写看 ... -
并发编程 出纳-顾客模型 仿真练习
2010-11-29 22:09 1120这个仿真模型包括如下几个对象: 顾客: 随机的时间间隔出现顾 ... -
Semaphore--给队列加上许可证
2010-11-28 16:12 1119在如下的场景,我们可能需要加入类似许可证的实现: 有一个资源 ... -
shutdown和shutdownNow--多线程任务的关闭
2010-11-28 14:22 2560采用5.0的线程池关闭线程,不管怎样,最后都是调用Interr ... -
PriorityBlockingQueue优先级规则
2010-11-28 10:17 14684PriorityBlockingQueue里面存储的对象必须是 ... -
ThreadPoolExecutor线程池实现逻辑
2010-11-27 23:08 3113之前不知道是看了哪篇文章,形成了一个概念,说ThreadPoo ... -
各种同步方法性能比较(synchronized,ReentrantLock,Atomic)
2010-11-27 10:27 129885.0的多线程任务包对于同步的性能方面有了很大的改进,在原有s ... -
阻塞任务队列DelayQueue
2010-11-24 22:14 2351DelayQueue也和其他阻塞队列一样,采用put和take ... -
多线程任务协作:CountDownLatch的使用
2010-11-24 18:50 1165多线程任务协作中,如果有一个任务,需要在其他线程的任务完成以后 ... -
JDK5提供的阻塞队列
2010-11-24 18:19 1316JDK5的concurrent包里面尽是宝贝,还好我有的是时间 ... -
线程外捕获某个线程内异常的方法
2010-11-20 16:24 1800由于线程本质的特性,我们并不能直接捕获从线程中逃逸的异常,一旦 ... -
原来5.0就已经优化好了字符串的连接符号
2010-11-11 12:24 11055.0里面, 字符连接用+号,速度已经可以和StringBuf ... -
Java垃圾回收
2010-11-11 12:20 1068之前总是觉得掌握了Java的垃圾回收机制,但稍微讨论下,就发现 ...
相关推荐
java并发编程的艺术读书笔记根据章节整理的核心内容,便于自己理解
Java整个知识体系,大概介绍了java进阶需要学习的相关知识
Java面试整理笔记,包含基础篇和进阶篇 其中包括 1、java基础 2、java并发编程 3、JVM 4、数据结构与算法 5、网络协议 6、数据库 7、框架相关 8、微服务 9、中间件相关 10、Linux
Java高并发秒杀API之业务分析与DAO层源码和整理的笔记 seckill是项目源码 note是整理的笔记
Java语音项目的资源包括原生的JSAPI、开源库如CMU Sphinx和FreeTTS,商业化的服务如Google Cloud Speech-to-Text API,以及其他框架和工具。通过利用这些资源,您可以开发出功能强大的语音应用程序。Java语音项目的...
张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。
并发编程实战》阅读笔记 有关 Java 并发编程~ 别急别急,在重写它啦~,会补充一些新的内容进去,预计 2020/02 完成。 Content Java 并发编程基础 保证线程安全的两个角度 构造安全的并发应用程序 Java 并发高级主题 ...
并发编程学习笔记,来源于 itmuch整理,是学习并发的不错的学习资料,有大神的个人感悟。介绍了一些概念,比如并发,高并发,并行,锁。
对多线程高并发编程学习的一个总结,整理了多线程在实际应用中的例子。主要参考了马士兵老师在java高并发编程公开课视频中的例子,并在此基础上进行学习和总结!
matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接...
Java并发编程学习笔记 本项目整理自《Java7并发编程实战手册》,感兴趣的话推荐阅读原著 本章内容包括: 线程的创建和运行 线程信息的获取和设置 线程的中断 线程中断的控制 线程的Hibernate和恢复 等待线程的终止 ...
秒杀----- Java高并发秒杀API之业务分析与DAO层原始码和整理的笔记seckill是项目源码note是整理的笔记
JAVA核心知识点整理,JVM 内存区域,垃圾回收与算法,JAVA 集合,JAVA 多线程并发
Java后台开发岗面试笔记整理,包含计算机网络、操作系统、集合框架、JVM内存、多线程并发、MySQL、Redis、Spring相关、Java基础知识、项目相关、系统设计问题、Linux相关、正则表达式、设计模式、算法总结等。
以后不再维护,转移到笔记总览(source目录)反弹:Java笔记基础java知识点,基本全是代码+注释反射,注解,jdbc,javaweb,redis基本使用java并发基础,完善中。替代设计原理。 杂项,日常学习中遇见的一些问题,...
《实战Java高并发程序设计》笔记和源码笔记《实战Java高并发程序设计》中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了笔者精心制作相关笔记并整理...
Java并发体系学习思维笔记.xmind java筑基(基础)面试专题系列(一):Tomcat+Mysql+设计模式 java筑基(基础)面试专题系列(二):并发+Netty+JVM JVM JVM与性能优化知识点整理 JVM和性能优化学习思维笔记.xmind ...
Java并发编程.pdf JAVA核心知识点整理.pdf Java高级架构知识点整理.pdf Java高级架构面试知识点整理.pdf JVM与性能优化知识点整理.pdf MySQL性能调优与架构设计解析文档.pdf Nginx入门到实战.pdf springCloud笔记....
2022java面试题、JVM面试题、多线程面试题、并发编程、Redis面试题、MySQL面试题、Java2022面试题、Netty面试题 一、内容概览 本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用...