Java countDownLatch如何实现多线程任务阻塞等待

 更新时间:2020年10月15日 08:34:57   投稿:yaominghui  
这篇文章主要介绍了Java countDownLatch如何实现多线程任务阻塞等待,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

我这里需要通过多线程去处理数据,然后在所有数据都处理完成后再往下执行。这里就用到了CountDownLatch。把countdownlatch作为参数传入到每个线程类里,在线程中处理完数据后执行countdown方法。在所有countdownlatch归零后,其await方法结束阻塞状态而往下执行。

具体代码如下:

将多线程任务提交线程池

   @Bean(name = "ggnews_executor")
	public Executor postExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setCorePoolSize(1);
		executor.setMaxPoolSize(1);
		executor.setQueueCapacity(1);
		executor.setKeepAliveSeconds(120);
		executor.setThreadNamePrefix("executor-");
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
		return executor;
	}
	//通过定时任务调用的fetch方法,为了避免定时任务在多次执行中失效,通异步指定线程池的方式进行调用
	@Async("ggnews_executor")
	public void fetch() {
		if(fetchFlag.getAndSet(false)) {
			List<FetchTag> tags = fetchTagService.selectFetchTagList(fetchTag);
			CountDownLatch downLatch = new CountDownLatch(tags.size());
			for (FetchTag tag : tags) {
				FetchTag tagNew;
				try {
					tagNew =(FetchTag) tag.clone();
				} catch (Throwable e) {
					log.error("",e);
					continue;
				}
        //作为参数将CountDownLatch传入
				InnerRunner innerRunner = new InnerRunner(downLatch, tagNew);
				executor.execute(innerRunner);
			}
			try {
        //等待线程执行完毕,如果十分钟后还没结束也会停止阻塞状态
				downLatch.await(10,TimeUnit.MINUTES);
				fetchFlag.getAndSet(true);
			} catch (Throwable e) {
				log.error("fetch()方法发生错误:{}", e);
				fetchFlag.getAndSet(true);
				//e.printStackTrace();
			} finally {
				fetchFlag.getAndSet(true);
			}
		} else {
			log.info("=======上次抓取尚未结束=========");
		}
	}

InnerRunner为要执行具体任务的线程类

private class InnerRunner implements Runnable {
		private CountDownLatch downLatch;
		private FetchTag tag;
		private InnerRunner(CountDownLatch downLatch, FetchTag tag) {
			this.downLatch = downLatch;
			this.tag = tag;
		}
		@Override
		public void run() {
      //将countDown方法移入到具体方法中的finally块中,以保证即使在抛出异常的情况下也算执行了此次任务,countdown会被执行
			fetchGG(tag.getTag(), downLatch);
			//downLatch.countDown();
			this.tag = null;
		}
	}
private static final String GOOGLE_URL_IN = "https://news.google.com/rss/search?hl=hi&gl=IN&ceid=IN:hi&q=";
public void fetchGG(String tag, CountDownLatch downLatch) {
		try {
			Document document = Jsoup.parse(new URL(GOOGLE_URL_IN + URLEncoder.encode("\"" + tag + "\"", "utf-8")), 30000);
			Elements elements = document.getElementsByTag("item");
			int rank = 1;
			for (Element element : elements) {
				
				String sourceTitle = element.getElementsByTag("title").get(0).text();
				log.info("source title:" + sourceTitle);
			}
		} catch (Throwable e) {
			log.info("fetch google url error", e);
		} finally {
      //肯定会被执行
			downLatch.countDown();
		}
	}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • idea中断点类型之All和Thread的区别介绍

    idea中断点类型之All和Thread的区别介绍

    使用all模式对于程序中含有多个线程来说,会将多个线程都阻塞在断点,此时所有的线程都执行到此处,在最后一个线程执行到此处是会发生暂停,在这之前的线程会继续执行到任意位置,本文给大家详细介绍下idea中断点类型之All和Thread的区别,感兴趣的朋友一起看看吧
    2022-03-03
  • Springboot+Mybatis中typeAliasesPackage正则扫描实现方式

    Springboot+Mybatis中typeAliasesPackage正则扫描实现方式

    这篇文章主要介绍了Springboot+Mybatis中typeAliasesPackage正则扫描实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Redis中高并发读写性能的深度解析与优化

    Redis中高并发读写性能的深度解析与优化

    Redis 作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨 Redis 的读写并发能力,感兴趣的小伙伴可以了解下
    2025-03-03
  • 在SpringBoot中使用jwt实现token身份认证的实例代码

    在SpringBoot中使用jwt实现token身份认证的实例代码

    你还不会在SpringBoot中使用jwt实现token身份认证吗,本文小编就给大家详细的介绍一下在SpringBoot中使用jwt实现token身份认证的实例代码,感兴趣的同学可以自己动手试一试
    2023-09-09
  • 必须要学会的JMM与volatile

    必须要学会的JMM与volatile

    这篇文章主要介绍了必须要学会的JMM与volatile,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Maven 主模块和子模块pom.xml依赖声明

    Maven 主模块和子模块pom.xml依赖声明

    这篇文章主要介绍了Maven 主模块和子模块pom.xml依赖声明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring集成Web环境与SpringMVC组件的扩展使用详解

    Spring集成Web环境与SpringMVC组件的扩展使用详解

    这篇文章主要介绍了Spring集成Web环境与SpringMVC组件,它是一个MVC架构,用来简化基于MVC架构的Web应用开发。SpringMVC最重要的就是五大组件
    2022-08-08
  • 在Spring-Boot中如何使用@Value注解注入集合类

    在Spring-Boot中如何使用@Value注解注入集合类

    这篇文章主要介绍了在Spring-Boot中如何使用@Value注解注入集合类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot配置lombok与logback过程解析

    SpringBoot配置lombok与logback过程解析

    这篇文章主要介绍了SpringBoot配置lombok与logback过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java调用远程服务器的shell脚本以及停止的方法实现

    java调用远程服务器的shell脚本以及停止的方法实现

    这篇文章主要介绍了java调远程服务器的shell脚本以及停止的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论