版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线都可以使用线。在开发过程中,合理地使用线能够带来3个好处。Java资源的,因为java提供了线。在jdk1.5以前的版本中,线的使用是及其简陋的,但是在JDK1.5后,有了很大的改善。JDK1.5java.util.concurrent,java.util.concurrentExecutor(JDK1.52004),但是很多程序员对于其中的一些原理ExecutorThreadPoolExecutor类,ExecutorsnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其实也只是ThreadPoolExecutor下的线那么它的底层原理是怎样实现的呢这篇就来介绍下ThreadPoolExecutor线的运行过程corePoolSize:池的大小。当有任务来之后,就会创建一个线程去执行任务,当线中的线程数corePoolSizeumPoolSize:线最大线程数,它表示中最多能创建多少个线程keepAliveTime:unit:keepAliveTime7TimeUnit7Java通过Executors(jdk1.5并发包)提供四种线,分别为newFixedThreadPool创建一个定长线,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool创建一个定长线,支持定时及周期性任务执行。newSingleThreadExecutor创建一个单线程化的线,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。////无限大小 ExecutorServicenewCachedThreadPool=Executors.newCachedThreadPool();for(inti=0;i<10;i++){finalinttemp=i;newCachedThreadPool.execute(newRunnable(){publicvoidrun(){try{}catch(Exceptione)//TODO:handle}System.out.println(Thread.currentThread().getName()+",i:"+}}}总结:线为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不ExecutorServiceExecutorServicenewFixedThreadPool=Executors.newFixedThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newFixedThreadPool.execute(newRunnable(){publicvoidrun()System.out.println(Thread.currentThread().getId()+",i:"+}}ScheduledExecutorServiceScheduledExecutorServicenewScheduledThreadPool=Executors.newScheduledThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newScheduledThreadPool.schedule(newRunnable(){publicvoidrun()System.out.println("i:"+}},3,}ExecutorServiceExecutorServicenewSingleThreadExecutor=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++){finalintindex=i;newSingleThreadExecutor.execute(newRunnable(){publicvoidrun(){System.out.println("index:"+index);try{}catch(Exceptione)//TODO:handle}}}注意:提交一个任务到线中,线的处理流程如下任务的性质:CPU,IO任务性质不同的任务可以用不同规模的线分开处理。CPU密集型任务配置尽可能少的线程数量,如配Runtime.getRuntime().availableProcessors()CPU执行,需要注意的是如果一直有优先级高的任务提交到队列里,那么优先级低的任务可能不能执行CPU。I/O前者称为计算密集型(CPU)computer-bound,I/O,I/O-boundJavaSelect*fromxxxforJAVAsynchronized和publicclassTestimplementspublicclassTestimplementsRunnablepublicsynchronizedvoidget()System.out.println("name:"+Thread.currentThread().getName()+"get();");}publicsynchronizedvoidset()System.out.println("name:"+Thread.currentThread().getName()+"}publicvoidrun(){}publicpublicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();newThread(ss).start();newThread(ss).start();}}publicclassTest02extendsThread{ReentrantLockpublicclassTest02extendsThread{ReentrantLocklock=newReentrantLock();publicvoidget(){}publicvoidset(){}publicvoidrun(){}publicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();new}}存)。这就需要一个读/写锁来解决这个问题。Java5java.util.concurrentpublicpublicclassCachestaticMap<String,Object>map=newHashMap<String,Object>();staticReentrantReadWri ockrwl=newReentrantReadWri staticLockr=rwl.readLock();staticLockw= //publicstaticfinalObjectget(Stringkey)try{System.out.println("正在做读的操作,keykey开始Objectobject=System.out.println("正在做读的操作,keykey结束");return}catch(InterruptedExceptione)}finally}return}//publicstaticfinalObjectput(Stringkey,Objectvalue)try{System.out.println("正在做写的操作,keykey",valuevalue开始.");Objectobject=map.put(key,System.out.println("正在做写的操作,keykey",valuevalue结束.");return}catch(InterruptedExceptione)}finally}return}}publicstaticfinalvoidclear()try{}finally}}publicstaticvoidmain(String[]args){newThread(newRunnable(){publicvoidrun()for(inti=0;i<10;i++){Cache.put(i+"",i+"");}}newThread(newRunnable()publicvoidrun()for(inti=0;i<10;i++){Cache.get(i+"");}}}}CAS与锁相比,使用比较交换(下文简称CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它对就凭借这两个优势,就值得我们尝试使用无锁的并发):新,则当前线程什么都不做。最后,CASVCAS操作是抱观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS操并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CASAtomicallyincrementsbyonethecurrent*@returntheupdatedpublicfinalintincrementAndGet(){for(;;){intcurrent=intnext=current+ if(compareAndSet(current,next))returnnext;}}privateprivateAtomicReference<Thread>sign=newpublicvoidlock()Threadcurrent=whilepareAndSet(null,current))}}publicvoidunlock()Threadcurrent=Thread.currentThread();pareAndSet(current,null);}publicpublicclassTestimplementsRunnable{staticintsum;privateSpinLockpublicTest(SpinLocklock){this.lock=lock;}@param@throwspublicstaticvoidmain(String[]args)throwsInterruptedException{SpinLocklock=newSp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 简历中自我评价15篇
- 法宣工作总结3篇
- 2025年CRO服务项目规划申请报告模范
- 2025年健康服务项目申请报告模板
- 2025年ITO靶材项目立项申请报告范文
- 专项计划自荐信汇编七篇
- 安全演讲稿范文七篇
- 大学毕业生自我鉴定经典13篇
- 二年级老师教学计划五篇参考
- 初中生自我介绍范文集合六篇
- 海蒂(世界文学名著经典)
- 中国马克思主义与当代知到章节答案智慧树2023年西安交通大学
- 变电站检修规程完整
- 海南文昌2x460MW级燃气-蒸汽联合循环电厂
- 形式逻辑学全套课件
- 姜安《政治学概论》(第2版)笔记和典型题(含考研真题)详解
- 国开电大公共行政学形考任务二答案
- YY/T 0698.1-2011最终灭菌医疗器械包装材料第1部分:吸塑包装共挤塑料膜要求和试验方法
- GB/T 25249-2010氨基醇酸树脂涂料
- 元旦知识竞赛(试题24道含答案)
- 数码电子阴道镜EK-6000B说明书
评论
0/150
提交评论