版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线都可以使用线。在开发过程中,合理地使用线能够带来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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年内蒙古机电职业技术学院单招职业倾向性测试题库及完整答案详解1套
- 2026年南充职业技术学院单招职业适应性考试题库含答案详解
- 2026年江苏农林职业技术学院单招职业技能考试题库含答案详解
- 2026年安徽省芜湖市单招职业倾向性测试题库参考答案详解
- 2026年浙江省丽水市单招职业适应性测试题库参考答案详解
- 2026年山西省吕梁市单招职业适应性测试题库及参考答案详解1套
- 2026年吉安职业技术学院单招职业倾向性测试题库及参考答案详解一套
- 2026年广东省茂名市单招职业倾向性测试题库及参考答案详解1套
- 2026年南充文化旅游职业学院单招职业技能考试题库及完整答案详解1套
- 2026年梅河口康美职业技术学院单招职业倾向性考试题库及答案详解1套
- 外观不良改善报告
- 《涉江采芙蓉》课件33张
- 测井作业工程事故应急预案
- “装配式建筑”施工案例详解图文并茂
- 医疗耗材配送服务方案
- 高三期末考试心态调整和考试技巧指导课件
- 输出DAG的所有拓扑排序序列
- 基础部分6se70变频柜-整流单元
- GB∕T 37092-2018 信息安全技术密码模块安全要求
- 2022年《内蒙古自治区建设工程费用定额》取费说明
- 浅孔留矿法采矿方法设计
评论
0/150
提交评论