




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线都可以使用线。在开发过程中,合理地使用线能够带来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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 杭州市滨江区九年级(上)期末数学试卷
- 49 选择性必修2 第八单元 第40讲 种群数量的变化
- 2024年河北省中考真题及答案
- 生态环保地下室租赁与合作治理协议
- 拆除房屋及后续规划开发协议
- 智能家居产业厂房转租及智能家居产品研发合同
- 生字教学常规课件图片
- 鸿合教学一体机课件在哪
- 2024-2025学年福建省龙岩市连城县一中高一下学期月考化学试题及答案
- 运输企业社会责任考核试卷
- 湖北武汉洪山区招考聘用社区干事235人模拟检测试卷【共1000题含答案解析】
- GB/T 3532-2009日用瓷器
- GB/T 16989-1997土工布接头/接缝宽条拉伸试验方法
- 空客320飞机舱门位置盛秀华课件
- 压床机构设计课程设计说明书-机械原理课程设计Word版
- 《公司理财》期末考试题库(附答案)
- 脑卒中的三级预防健康教育
- 医学高级职称评审答辩报告PPT模板
- DB4451-T 1-2021《地理标志产品+凤凰单丛(枞)茶》-(高清现行)
- 消防管理检查评分表
- 无人机驾驶员证照考试培训题库与答案
评论
0/150
提交评论