当前位置: 首页 > 后端技术 > Java

多线程顺序运行的4种方法,面试问就知道了!

时间:2023-04-01 18:41:15 Java

文章介绍了4种方法,简单易懂,通过4个demo来吸引别人。1、在子线程中,使用join()方法指定顺序。使用join()方法“阻塞”当前线程,等待指定线程执行完毕再继续执行。例:在线程thread2中,添加thread1.join(),意思是当当前线程2运行到这行代码时,会进入阻塞状态,直到线程thread1执行完毕,线程thread2才会继续运行executing,即线程thread1和线程thread2的运行顺序是有保证的。publicclassThreadJoinDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{finalThreadthread1=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("打开冰盒!");}});finalThreadthread2=newThread(newRunnable(){@Overridepublicvoidrun(){try{thread1.join();}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("拿出一瓶牛奶!");}});finalThreadthread3=newThread(newRunnable(){@Overridepublicvoidrun(){try{thread2.join();}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("关上冰箱!");}});//下面三行代码的顺序可以随意调整,不会影响程序的运行结果,因为我们已经通过"join()方法指定了运行顺序"在子线程thread3.start();thread2.start();thread1.start();}}运行结果:打开冰箱!取出一瓶牛奶!关闭冰箱!2.在主线程中,使用join()方法指定顺序不同的是,子线程是指Thread内部发生的代码,而主线程是指主函数中发生的代码。我们可以使用join()main函数中的方法使主线程阻塞等待,达到按指定顺序执行的目的。publicclassThreadMainJoinDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{finalThreadthread1=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("打开冰箱!");}});finalThreadthread2=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("拿出一瓶牛奶!");}});finalThreadthread3=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("关掉冰箱!");}});thread1.start();thread1.join();thread2.start();线程2.join();thread3.start();}}我不会介绍基础知识。我写了很多多线程的博客教程。推荐大家看这里:https://www.javastack.cn/cate..输出结果:打开冰箱!拿出一瓶牛奶!关冰箱!3.通过倒计时定时器实现CountDownLatchCountDownLatch通过计数器提供更灵活的控制,只要检测到计数器为0,当前线程就可以往下执行OK不管对应的线程是否执行公共类ThreadCountDownLatchDemo{privatestaticCountDownLatchcountDownLatch1=newCountDownLatch(1);私人静态CountDownLatchcountDownLatch2=newCountDownLatch(1);publicstaticvoidmain(String[]args){finalThreadthread1=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("打开冰盒!");countDownLatch1.countDown();}});finalThreadthread2=newThread(newRunnable(){@Overridepublicvoidrun(){try{countDownLatch1.await();System.out.println("拿出一瓶牛奶!");countDownLatch2.countDown();}catch(InterruptedExceptione){e.printStackTrace();}}});finalThreadthread3=newThread(newRunnable(){@Overridepublicvoidrun(){try{countDownLatch2.await();System.out.println("关掉冰箱!");}catch(InterruptedExceptione){e.printStackTrace();}}});//下面三行代码的顺序可以随意调整,不会影响程序的运行结果thread3.start();thread1.start();thread2.start();}}输出结果:打开冰箱!拿出一瓶牛奶!关冰箱!4.通过创建单线程池newSingleThreadExecutor()实现单线程线程池(newSingleThreadExecutor)的优势,串行执行所有任务公共类ThreadPoolDemo{静态ExecutorServiceexecutorService=Executors.newSingleThreadExecutor();publicstaticvoidmain(String[]args){finalThreadthread1=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("打开冰箱!");}});finalThreadthread2=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("拿出一瓶牛奶!");}});finalThreadthread3=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("关掉冰箱!");}});executorService.submit(thread1);executorService.submit(thread2);executorService.submit(thread3);executorService.shutdown();//使用完记得关闭线程池}}输出结果:打开冰箱!拿出一瓶牛奶!关冰箱!来源:blog.csdn.net/jqc874789596/article/details/100557300近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。.3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!