- 浏览: 248277 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 11311. 整理自己的所做过的B ... -
Oracle ADF 学习笔记 -- Entity Object
2011-10-07 23:57 5327通过这个把月的接触, ... -
finally关键字与return关键字的关系
2011-03-15 17:26 1331finally关键字与return关键字的关系 1. fi ... -
采用泛型,自己实现一个Stack
2010-12-12 12:26 1033实现思路: 1.建立一个结点,每个结点都有一个保存自身val ... -
关于类的equals和hashcode方法
2010-12-06 22:21 1123当我们想要改写equals方法的时候,总是应该打起12分的精神 ... -
获取字符组所有排列字符串的算法
2010-12-04 09:43 1636刚看了论坛上有个很有意思的递归算法题,忍不住自己也动手来写写看 ... -
并发编程 出纳-顾客模型 仿真练习
2010-11-29 22:09 1156这个仿真模型包括如下几个对象: 顾客: 随机的时间间隔出现顾 ... -
Semaphore--给队列加上许可证
2010-11-28 16:12 1156在如下的场景,我们可能需要加入类似许可证的实现: 有一个资源 ... -
shutdown和shutdownNow--多线程任务的关闭
2010-11-28 14:22 2615采用5.0的线程池关闭线程,不管怎样,最后都是调用Interr ... -
PriorityBlockingQueue优先级规则
2010-11-28 10:17 14731PriorityBlockingQueue里面存储的对象必须是 ... -
ThreadPoolExecutor线程池实现逻辑
2010-11-27 23:08 3171之前不知道是看了哪篇文章,形成了一个概念,说ThreadPoo ... -
各种同步方法性能比较(synchronized,ReentrantLock,Atomic)
2010-11-27 10:27 131615.0的多线程任务包对于同步的性能方面有了很大的改进,在原有s ... -
阻塞任务队列DelayQueue
2010-11-24 22:14 2390DelayQueue也和其他阻塞队列一样,采用put和take ... -
多线程任务协作:CountDownLatch的使用
2010-11-24 18:50 1211多线程任务协作中,如果有一个任务,需要在其他线程的任务完成以后 ... -
JDK5提供的阻塞队列
2010-11-24 18:19 1359JDK5的concurrent包里面尽是宝贝,还好我有的是时间 ... -
线程外捕获某个线程内异常的方法
2010-11-20 16:24 1849由于线程本质的特性,我们并不能直接捕获从线程中逃逸的异常,一旦 ... -
原来5.0就已经优化好了字符串的连接符号
2010-11-11 12:24 11495.0里面, 字符连接用+号,速度已经可以和StringBuf ... -
Java垃圾回收
2010-11-11 12:20 1107之前总是觉得掌握了Java的垃圾回收机制,但稍微讨论下,就发现 ...
相关推荐
Java高并发秒杀API之业务分析与DAO层源码和整理的笔记seckill是项目源码note是整理的笔记.zip Java高并发秒杀API之业务分析与DAO层源码和整理的笔记seckill是项目源码note是整理的笔记.zip Java高并发秒杀API之业务...
这份"Java十大基础笔记整理(PDF)"提供了全面的Java基础知识概览,适合初学者进行学习和复习。下面,我们将深入探讨Java的基础知识,涵盖核心概念、语法和编程实践。 1. **Java简介**:Java是由Sun Microsystems...
### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...
这份名为“达内Java_笔记整理.rar”的压缩文件包含了丰富的Java学习资料,主要目标是帮助学习者节省在寻找合适学习资源上的时间,提高学习效率。达内是一家知名的教育机构,其整理的Java笔记通常会覆盖从基础到进阶...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
- Java内建了多线程机制,通过`Thread`类或实现`Runnable`接口可以创建和管理线程,实现并发执行。 4. **集合框架**: - `Collection`接口是所有集合类的根接口,分为`List`和`Set`两大分支。 - `List`接口包括`...
"JAVA核心知识点整理.zip"这个压缩包文件包含了对Java进阶学习的重要知识点的详细概述,主要集中在PDF文档"JAVA核心知识点整理.pdf"中。以下是这份资料可能涵盖的主要内容: 1. **Java基础**:首先,你会学到Java的...
这份"JAVA基础笔记"涵盖了从入门到进阶的关键知识点,对于初学者或是希望巩固基础的开发者来说,都是一份宝贵的资源。 笔记可能包括以下几个部分: 1. **Java简介**:Java的起源、特点和应用领域,以及为什么它在...
在Java编程领域,开发一个能够处理Kindle电子书笔记的桌面程序是一...以上就是"java代码实现Kindle电子书笔记整理"项目中涉及的关键技术和实现细节。通过这样的程序,用户可以更高效地管理和共享自己的Kindle阅读体验。
java并发编程的艺术读书笔记根据章节整理的核心内容,便于自己理解
以下是根据这份笔记整理的一些关键知识点: 1. **Java基础**:Java的基础语法是学习的起点,包括变量、数据类型、运算符、流程控制(如if语句、for循环、while循环)以及方法的定义和调用。理解这些基本元素是编写...
### 毕向东Java笔记知识点总结 #### 第一章:编程基础 1. **Java的特性和优势**: - **简单性**:Java的设计哲学是“使编程变得简单”。 - **面向对象**:Java完全支持面向对象编程概念如封装、继承和多态。 - ...
Java面试整理笔记,包含基础篇和进阶篇 其中包括 1、java基础 2、java并发编程 3、JVM 4、数据结构与算法 5、网络协议 6、数据库 7、框架相关 8、微服务 9、中间件相关 10、Linux
Java的多线程也是重要的知识点,笔记可能会讨论线程的创建(Thread类和Runnable接口)、线程同步(synchronized关键字、wait/notify机制、Lock接口)、线程池(ExecutorService和ThreadPoolExecutor)以及并发工具类...
十一、Java并发编程 Java提供了丰富的并发工具,如ExecutorService、Semaphore、CountDownLatch等,帮助开发者编写高效的多线程应用。笔记会讨论并发模型、线程池的最佳实践以及并发集合的使用。 十二、Java 8及更...
这份"java web 笔记整理"涵盖了该领域的关键概念和技术,包括Servlet、JSP、MVC模式、JNDI、JTA以及EJB等核心内容。以下是根据笔记内容整理出的知识点详解: 1. **Servlet**:Servlet是Java平台上的服务器端组件,...
Java语音项目的资源包括原生的JSAPI、开源库如CMU Sphinx和FreeTTS,商业化的服务如Google Cloud Speech-to-Text API,以及其他框架和工具。通过利用这些资源,您可以开发出功能强大的语音应用程序。Java语音项目的...
**Java Redis 学习笔记概览** 在Java开发中,Redis作为一个高性能的键值存储系统,常被用于缓存、消息队列、分布式锁等多种场景。...同时,配合Markdown格式,便于阅读和整理笔记,而PDF格式则方便离线查阅和打印。
- **定义**:Java 中的多线程是指程序在同一时间并发运行多个线程。 - **创建方式**:通过实现 `Runnable` 接口或继承 `Thread` 类。 - **生命周期**:包括新建、就绪、运行、阻塞和死亡五个阶段。 ### 四、Java ...
这份“Java面试笔记整理”旨在帮助求职者系统性地复习和掌握Java面试的关键知识点。 首先,Java基础是面试的基石。这包括对Java语法的理解,如变量、数据类型、运算符、流程控制语句(如if-else、switch-case、for...