装了Intellij,就是装了Gradle。

新建一个Gradle项目。然后下面这个页面要勾选上面两项:

Use auto-import和Create directories for empty content roots automatically这两个选项勾上。

新建项目中的各个目录和文件:

  • .gradle,gradle的相关支持文件,不用管
  • .idea,IntelliJ IDEA的相关文件,不用管
  • build,构建生成物,存放项目构建中生成的class和jar包
  • gradle,一个gradle的包装程序,貌似直接用gradle不太好,得再包一层,这个其实我们也不用管
  • src,我们写代码的地方,不用说了吧
  • build.gradle,gradle的构建配置,这是我们要关心的,相当于Maven的pom.xml
  • 项目名称.iml,IntelliJ IDEA的项目文件
  • gradlew,一段gradle wrapper的运行脚本,For *nix
  • gradlew.bat,一段gradle wrapper的运行脚本,For Windows
  • settings.gradle,配置?

build.gradle配置:

group 'com.async.client'
version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 repositories {
mavenLocal()
mavenCentral()
} tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
} dependencies {
compile group: 'org.apache.httpcomponents', name:'httpasyncclient', version:'4.1.1'
testCompile group: 'junit', name: 'junit', version: '4.11'
}

加上mavenLocal()这句话之后,Gradle会尝试先从本地Maven缓存中获取jar包,这样会更快一些。

dependencies则是各种依赖包了,compile表示编译时依赖,而testCompile表示执行单元测试时的编译的依赖。

task.withType()这段表示使用UTF-8编码,为了避免编译的问题,我们全部使用UTF-8编码即可。

Gradle项目窗口右键项目名,“Synchronizing ...”。

国外的maven实在太慢了,在gradle里面配置如下:

repositories {
// maven库
def cn = "http://maven.aliyun.com/nexus/content/groups/public/"
def abroad = "http://central.maven.org/maven2/"
// 先从url中下载jar若没有找到,则在artifactUrls中寻找
maven {
url cn
artifactUrls abroad
}
}

然后发现两个repositories重复了,所以去掉原来的,最后文件内容如下:

group 'com.async'
version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 repositories {
// maven库
def cn = "http://maven.aliyun.com/nexus/content/groups/public/"
def abroad = "http://central.maven.org/maven2/"
// 先从url中下载jar若没有找到,则在artifactUrls中寻找
maven {
url cn
artifactUrls abroad
}
} dependencies {
compile group: 'org.apache.httpcomponents', name:'httpasyncclient', version:'4.1.1'
testCompile group: 'junit', name: 'junit', version: '4.11'
}

使用菜单 View-> Tools View -> Gradle 调出Gradle的配置界面。

点上面这个按钮,就可以重新加载依赖。用国内的repository的确快很多。

现在包都下载好了,开始写程序。

其中,用到了CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

另外注意到HttpAsyncClients的用法和JS里面的异步调用很相似。

package com.async;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.util.EntityUtils; import java.io.IOException;
import java.util.concurrent.CountDownLatch; /**
* Created by baidu on 16/11/26.
*/
public class AsyncClient {
public static void main(String[] argv) {
CloseableHttpAsyncClient httpAsyncClient = HttpAsyncClients.createDefault();
httpAsyncClient.start(); final CountDownLatch latch = new CountDownLatch(1);
final HttpGet httpGet = new HttpGet("https://www.alipay.com/"); System.out.println("Caller thread id: " + Thread.currentThread().getId());
httpAsyncClient.execute(httpGet, new FutureCallback<HttpResponse>() {
@Override
public void completed(HttpResponse result) {
latch.countDown();
System.out.println("Callback thread id: " + Thread.currentThread().getId());
System.out.println(httpGet.getRequestLine() + "->" + result.getStatusLine());
String content = null;
try {
content = EntityUtils.toString(result.getEntity(), "UTF-8");
System.out.println("Response content is: " + content);
} catch (IOException e) {
e.printStackTrace();
} } @Override
public void failed(Exception ex) {
latch.countDown();
System.out.println("Callback thread id: " + Thread.currentThread().getId());
System.out.println(httpGet.getRequestLine() + "->" + ex);
} @Override
public void cancelled() {
latch.countDown();
System.out.println("Callback thread id: " + Thread.currentThread().getId());
System.out.println(httpGet.getRequestLine() + "->" + "cancelled");
}
}); try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
} try {
httpAsyncClient.close();
} catch (IOException e) {
e.printStackTrace();
} }
}

运行得到结果:

Caller thread id: 1
Callback thread id: 12
GET https://www.alipay.com/ HTTP/1.1->HTTP/1.1 200 OK
Response content is:
<!-- FD:83:homeproxy/home/startup.vm:START --><!-- FD:83:homeproxy/home/startup.vm:634:startup.schema:startup-头部页面描述:START --><!DOCTYPE html>
<html lang="en">
......

稍作封装就可以实现如“getJson()”这样的方法。

也许你还注意到了,这个HttpClient跟同步的版本一样,直接支持https,但如果网站的证书是自签的,默认还是不行的,解决方法当然有,但代码有些麻烦,我觉得还不如直接买张证书来得简单,如果网站是你管的话。

Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习的更多相关文章

  1. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  2. JavaWeb学习总结-04 Servlet 学习和使用

    一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...

  3. C++ 学习资料搜寻与学习(第一期)(未完待续)

    一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“S ...

  4. 【学习总结】Git学习-参考廖雪峰老师教程一-Git简介

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  5. 【学习总结】Git学习-参考廖雪峰老师教程八-使用GitHub

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  6. 【学习总结】Git学习-参考廖雪峰老师教程九-使用码云

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  7. ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...

  8. [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)

    about云课程最新课程Cloudera课程   零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ...

  9. Python学习教程(Python学习视频_Python学些路线):Day06 函数和模块的使用

    Python学习教程(Python学习视频_Python学些路线):函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. $$x_1 + x_2 + x ...

随机推荐

  1. passwd讲解

    root:$dffjioowwf/:16274:0:999999:7::: 1用户名:密码:最近修改密码的日期:密码不能更改的天数:密码过期时间:密码需要更改期限到拉前7发出警告:宽限天数:帐号过期时 ...

  2. POJ2186 (强连通分量缩点后出度为0的分量内点个数)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27820   Accepted: 11208 De ...

  3. Linux下安装php环境并且配置Nginx支持php-fpm模块[www]

    Linux下安装php环境并且配置Nginx支持php-fpm模块 http://www.cnblogs.com/freeweb/p/5425554.html 5分钟搭建 nginx +php --- ...

  4. js面向对象编程(三)非构造函数的继承(转载)

    Javascript面向对象编程(三):非构造函数的继承 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一 ...

  5. Selenium2+python自动化61-Chrome浏览器(chromedriver)【转载】

    前言 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrome浏览器版本号,对应的驱动文件版本号又不一样,如果版本号不匹配,是没法启动起来的. 一.Chrome遇到问题 1. ...

  6. 百度Map-JSAPI-覆盖物范围查询标记

    1.单点标记并添加说明信息 2.可视化区域范围 3.矩形覆盖物经纬度范围 说明:该项目为javaweb项目,标记点信息为数据库中存储信息] 参考API链接 http://api.map.baidu.c ...

  7. zoj3988

    zoj3988 题意 如果一个集合 \(\{i,j\}\) 满足 \(i\neq j\) 且 \(a[i]+a[j]\) 是素数,则称之为素数集合. 给出一些数字,这些数字可以组成多种素数集合,从这些 ...

  8. java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.XmlReaderContext.getResourceLoader()Lorg/springframework/core/io/ResourceLoader

    问题原因 在整合spring跟struts2是使用Maven,用到struts2-spring-plugin.jar,但是maven不但但加载了这个jar文件还有spring-beans:3.0.5. ...

  9. [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

    5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  ...

  10. small test on 5.30 morning T3

    经典的等价类计数问题,我们设 f(x) 为环长为 x 的时候的花环种类,那么答案显然等于 1/n  *  Σf( gcd (i,n) * [gcd(i,n)!=1] * [i>=0&&a ...