你了解 Guava 中有哪些线程池的扩展内容吗?

前言

本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见100个问题搞定Java并发

正文

1 .特殊的 DirectExecutor 线程池

在 MoreExecutors 中,提供了一个简单但是非常重要的线程池实现,即 DirectExecutor 线程池。

DirectExecutor 线程池很简单,它并没有真的创建或者使用额外线程,它总是将任务在当前线程中直接执行。

也许你会觉得很奇怪,为什么需要这么一个线程池呢?

这是软件设计上的需要。

从软件设计的角度上说,抽象是软件设计的根本和精髓。

将不同业务的共同属性提取并抽象成模型非常有利于对不同业务的统一处理。

我们总是希望并且倾向于使用通用的代码来处理不同的场景,因此,这就需要对不同场景进行统一的抽象和建模。

对于线程池来说,其技术目的是为了复用线程以提高运行效率,但其业务需求却是去异步执行一段业务指令。

但是有时候,异步并不是必要的。

因此,当我们剥去线程池的技术细节,仅关注其使用场景时便不难发现,任何一个可以运行 Runnable 实例的模块都可以被视为线程池,即便它没有真正创建线程。

这样就可以将异步执行和同步执行进行统一,使用统一的编码风格来处理同步和异步调用,进而简化设计。

举例

import com.google.common.util.concurrent.MoreExecutors;

import java.util.concurrent.Executor;

public class MoreExecutorsDemo {
	public static void main(String[] args) {
		Executor executor = MoreExecutors.directExecutor();
		executor.execute(() -> System.out.println("I am running in " + Thread.currentThread().getName()));
	}
}
I am running in main

可以看到,这个 Runnable 接口在主线程中执行。

注入不同的 executor 的实现,例如使用固定大小线程池替代 DirectExecutor ,无须修改代码便可以使程序拥有不同的行为,这也正是 DirectExecutor 的用意所在。

2 . Daemon 线程池

此外,在 MoreExecutors 中,还提供了将普通线程池转为 Daemon 线程池的方法。

在很多场合,我们并不希望后台线程池阻止程序的退出,当系统执行完成后,即便有线程池存在,依然希望进程结束执行。

此时,就可以使用 MoreExecutors.getExitingExecutorService() 方法。

import com.google.common.util.concurrent.MoreExecutors;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class MoreExecutorsDemo2 {
	public static void main(String[] args) {
		ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
		MoreExecutors.getExitingExecutorService(executor);
		executor.execute(() -> System.out.println("I am running in " + Thread.currentThread().getName()));
	}
}
I am running in pool-1-thread-1

上述代码输出后,立即退出程序,若不使用 MoreExecutors.getExitingExecutorService() 方法对 executor 线程池进行设置,则该程序无法正常退出,除非手动关闭 executor 线程池。

3 . 对 Future模式的扩展

在 JDK 自带的简单 Future 模式中,虽然我们可以使用 Future.get() 方法得到 Future 的处理结果,但是这个方法是阻塞的,因此并不利于我们开发高并发应用。

但在 Guava 中,增强了 Future 模式,增加了对 Future 模式完成时的回调接口,使得 Future 完成时可以自动通知应用程序进行后续处理。

举例

import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;

import java.util.concurrent.Executors;

public class FutureDemo {
	public static void main(String[] args) throws InterruptedException {
		ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

		ListenableFuture<String> task = service.submit(new RealData("x"));

		task.addListener(() -> {
			System.out.print("异步处理成功:");
			try {
				System.out.println(task.get());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}, MoreExecutors.directExecutor());

		System.out.println("main task done.....");
		Thread.sleep(3000);
	}
}

class RealData implements Callable<String> {
    private String para;
    public RealData(String para){
    	this.para=para;
    }
	@Override
	public String call() throws Exception {
    	
    	StringBuffer sb=new StringBuffer();
        for (int i = 0; i < 10; i++) {
        	sb.append(para);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
        return sb.toString();
	}
}
main task done.....
异步处理成功:xxxxxxxxxx
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【guava-***.jar中文文档.zip】 中包含: 中文文档:【guava-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【guava-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【guava-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【guava-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【guava-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: guava-***.jar中文文档.zip,java,guava-***.jar,com.google.guava,guava,***,com.google.common.annotations,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,google,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【guava-***.jar中文文档.zip】,再解压其中的 【guava-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', version: '***' Gradle (Short): implementation 'com.google.guava:guava:***' Gradle (Kotlin): implementation("com.google.guava:guava:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.google.common.annotations com.google.common.base com.google.common.base.internal ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.google.common.annotations.Beta com.google.common.annotations.GwtCompatible com.google.common.annotations.GwtIncompatible ...... ```
注:下文中的 *** 代表文件名中的版本号。 # 【guava-***.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【guava-***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【guava-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【guava-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【guava-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【guava-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: guava-***.jar中文-英文对照文档.zip,java,guava-***.jar,com.google.guava,guava,***,com.google.common.annotations,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,google,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【guava-***.jar中文-英文对照文档.zip】,再解压其中的 【guava-***-javadoc-API文档-中文(简体)-英语-对照版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', version: '***' Gradle (Short): implementation 'com.google.guava:guava:***' Gradle (Kotlin): implementation("com.google.guava:guava:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.google.common.annotations com.google.common.base com.google.common.base.internal ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.google.common.annotations.Beta com.google.common.annotations.GwtCompatible com.google.common.annotations.GwtIncompatible ...... ```
注:下文中的 *** 代表文件名中的版本号。 # 【guava-***.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【guava-***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【guava-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【guava-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【guava-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【guava-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: guava-***.jar中文-英文对照文档.zip,java,guava-***.jar,com.google.guava,guava,***,com.google.common.annotations,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,google,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【guava-***.jar中文-英文对照文档.zip】,再解压其中的 【guava-***-javadoc-API文档-中文(简体)-英语-对照版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', version: '***' Gradle (Short): implementation 'com.google.guava:guava:***' Gradle (Kotlin): implementation("com.google.guava:guava:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.google.common.annotations com.google.common.base com.google.common.base.internal ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.google.common.annotations.Beta com.google.common.annotations.GwtCompatible com.google.common.annotations.GwtIncompatible ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值