1. pravega广泛使用guava concurrent service。在此,对guava进行分析和demo解释。
2.项目和参考文档
项目官网 https://github.com/google/guava
API文档 https://google.github.io/guava/releases/snapshot-jre/api/docs/
guava的主要参考文档 https://github.com/google/guava/wiki 和 http://code.google.com/p/guava-libraries/wiki/GuavaExplained
中文介绍文档 http://ifeve.com/google-guava-serviceexplained/ 和 https://blog.csdn.net/Black_Lands/article/details/64440303
3. 三个更远一点的参考文档
Concurrency in Practice http://jcip.net/
书《effective java》
书《cocurrnecy in paractice》
4. AbstractExecutionThreadService的示例项目
4.1 AbstractExecutionThreadService的父实现了Service接口。熟悉本例之后,其他子类以此类推。
4.2 项目目录结构
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
│ ├── java
│ │ ├── Main.java
│ │ └── MainThread.java
│ └── resources
└── test
├── java
└── resources
4.3 build.gradle文件内容
group 'com.brian.demo.guava'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.guava:guava:27.0.1-jre'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
4.4 Main.java文件内容
import com.google.common.util.concurrent.Service;
public class Main {
public static void main(String[] args){
System.out.println("Hi,guava");
MainThread mt = new MainThread();
Service mtS = mt.startAsync();
System.out.println(mtS.state());
mt.awaitTerminated();
System.out.println("MainThread runs over");
}
}
4.5 MainThread.java文件内容
import com.google.common.util.concurrent.AbstractExecutionThreadService;
public class MainThread extends AbstractExecutionThreadService{
private Integer times = 0;
//第一步,只实现run函数,然后运行,观察效果
@Override
protected void run() throws Exception {
while (isRunning()){
System.out.println("MainThread is running...");
Thread.sleep(1000);
this.times+=1;
if (this.times >= 3){
System.out.println("stopAsync");
this.stopAsync();
}
}
}
//第二步,实现startUp函数,然后运行,观察效果。
@Override
protected void startUp() throws Exception {
super.startUp();
System.out.println("starUp func run,do something");
}
//第三步,实现triggerShutdown函数,然后运行,观察效果。
@Override
protected void triggerShutdown() {
super.triggerShutdown();
System.out.println("triggerShutdown func run, do something");
}
//第四步,实现shutDown函数,然后运行,观察效果。
@Override
protected void shutDown() throws Exception {
super.shutDown();
System.out.println("shutdown func run, do something");
}
}
4.6 运行结果
/home/brian/usr/jdk1.8.0_111/bin/java -javaagent:/home/brian/usr/idea-IC-172.4343.14/lib/idea_rt.jar=42869:/home/brian/usr/idea-IC-172.4343.14/bin -Dfile.encoding=UTF-8 -classpath /home/brian/usr/jdk1.8.0_111/jre/lib/charsets.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/deploy.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/cldrdata.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/dnsns.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/jaccess.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/jfxrt.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/localedata.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/nashorn.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/sunec.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/sunjce_provider.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/sunpkcs11.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/ext/zipfs.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/javaws.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/jce.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/jfr.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/jfxswt.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/jsse.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/management-agent.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/plugin.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/resources.jar:/home/brian/usr/jdk1.8.0_111/jre/lib/rt.jar:/home/brian/git-home/github/HiGuava/out/production/classes:/home/brian/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-jre/bd41a290787b5301e63929676d792c507bbc00ae/guava-27.0.1-jre.jar:/home/brian/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/brian/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/home/brian/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar:/home/brian/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/2.5.2/cea74543d5904a30861a61b4643a5f2bb372efc4/checker-qual-2.5.2.jar:/home/brian/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.2.0/88e3c593e9b3586e1c6177f89267da6fc6986f0c/error_prone_annotations-2.2.0.jar:/home/brian/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/ed28ded51a8b1c6b112568def5f4b455e6809019/j2objc-annotations-1.1.jar:/home/brian/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.17/f97ce6decaea32b36101e37979f8b647f00681fb/animal-sniffer-annotations-1.17.jar Main
Hi,guava
STARTING
starUp func run,do something
MainThread is running...
MainThread is running...
MainThread is running...
stopAsync
triggerShutdown func run, do something
shutdown func run, do something
MainThread runs over