装了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. Csharp 非安全代码

    using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { c ...

  2. docker push 镜像到本地仓库

    root@ubuntu:# uname -a Linux ubuntu --generic #-Ubuntu SMP Mon Feb :: UTC x86_64 x86_64 x86_64 GNU/L ...

  3. LeetCode the longest palindrome substring

    回文检测,参考http://blog.csdn.net/feliciafay/article/details/16984031 使用时间复杂度和空间复杂度相对较低的动态规划法来检测,具体的做法 图一 ...

  4. 【转】Linux Futex的设计与实现

    引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序" ...

  5. Shell中的while循环【转】

    转自:http://blog.chinaunix.net/uid-25880122-id-2901409.html while循环的格式   while expression do command c ...

  6. oracle创建用户赋予权限,删除权限

    --删除用户及及用户下的所有数据 drop user xxx cascade; --创建用户赋予密码 ; --赋予权限 grant dba to xxx; --删除权限 revoke dba from ...

  7. centos7.3安装caffe出现错误:/bin/ld: cannot find -lcblas /bin/ld: cannot find -latlas

    安装caffe时需要依赖库atlas,可使用yum -y install atlas-devel  安装,但是安装之后还是有可能出现错误: /bin/ld: cannot find -lcblas / ...

  8. Selenium2+python自动化43-判断title(title_is)【转载】

    前言 获取页面title的方法可以直接用driver.title获取到,然后也可以把获取到的结果用做断言. 本篇介绍另外一种方法去判断页面title是否与期望结果一种,用到上一篇Selenium2+p ...

  9. 我们应选择怎样的IT公司

    最近经常有朋友提问,同时收到几家公司的offer,应该如何选择,或者找工作的时候,找怎样的公司,我在这里阐述一下我的观点.但愿对朋友们有所帮助. 还是那句老话,选择什么样的公司,关键是你想要过什么样的 ...

  10. (五)cobbler自定义系统安装

    注意:需要提前获取到物理机对应的网卡的MAC地址,例如我这里使用虚拟机进行演示 cobbler system add --name=linux-node2.com --mac=00:50:56:22: ...