Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习

装了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,但如果网站的证书是自签的,默认还是不行的,解决方法当然有,但代码有些麻烦,我觉得还不如直接买张证书来得简单,如果网站是你管的话。

时间: 2024-08-26 01:13:07

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

如何学习ruby?Ruby学习技巧分享

怎么学习ruby?在学习ruby之前需要掌握哪些知识呢?这是很多想要学习ruby朋友的心声,我不具体给出答案,下面就给大家讲讲一位前辈学习ruby(http://www.maiziedu.com/course/ruby/)的学习历程吧.在大学时学的电子专业,在学校里学过C/汇编,在学习ruby前期,和大多数的Rubyist一样,我也是从学习Rails开始去了解Ruby的,在学习Rails之前,我正在使用JavaEE的SSH框架(struts+spring+hibernate), 当时也算是Jav

怎样找到一份深度学习的工作(附学习材料,资源与建议)

原文地址:How to get a job in deep learning 原文翻译与校对:@戴丹 && @胡杨 && 寒小阳 时间:2016年10月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/52777661 声明:版权所有,转载请联系作者并注明出 如果你是一个软件工程师(或者你现在正在学习这一方面),你肯定有机会听说过深度学习(有时候深度学习缩写为"DL").它现在是一个热门.且快速

PHP语言学习之html5的学习,一周总结

通过这周的html5的学习我整理了一下一些东西和一些总结 写代码的时候也开头都要对齐这样开起来很舒服,这些都是用到缩进键搞定的,比如<html></html>在一块写,要前后对齐,这样容易发现错误,而且看起来比较清晰 写代码是还有英文和中文的标点符号的问题,这些都要是注意的,(这基本是我在学习的时候遇到的问题) 要掌握好重要的标签,这样能够更好的学习.... 开始学习html 5 什么是html5HTML是由W3C的维护的 HTML是大小写不敏感的,HTML与html是一样的 HT

[Python学习]一、如何学习,学习资料

上手Python快一年了,用Python也开发了不少工具.项目,准备写一个系列来整理Python的学习. 1.Python的介绍: Python是一种面向对象的.解释型语言,发明与1989年. Python是一种高级语言,它在底层实现许多高级的数据结构,使得编程变得非常容易. Python的库非常丰富,它是大数据处理常用的语言的.开发快,效率相对高. Python应用广泛.比如豆瓣就是依靠Python实现的. Python运行平台广泛. 目前Python的版本已经到3.4, 但是Python2

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

一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“StdAfx.h”或者意外结尾的错误解决方案 jlins 2012-04-11 21:10 [Visual C++]绘图函数BitBlt的使用方法 jlins 2012-04-10 18:11 [C++]关于随机函数与概率设置 jlins 2012-04-10 02:53 [Visual C++]CD

[学习路线图1]PHP学习路线图(初级)

受众多网友建议,本文是个"学习路线图" 大家看完这篇文章就会知道我们的"学习路线图"到底是啥样的. 本次路线图的作者:沈逸 .李青春.某神秘大学老师 今天的话题是怎么学习PHP(初级). 我的团队目前大部分PC应用都用PHP开发,除非碰到实在需要使用java的方面或者客户要求,一般我们主推使用PHP语言,有以下几个无厘头原因: 1.原始积累较多,各种基础类库.开源类库和支持 2.大神级的队员,一个人可以当两个人用(你懂的) 3.我们接触的客户不知道为何都很"

[学习笔记] Sencha Cmd 学习笔记 Sencha Cmd是什么

本文地址: http://blog.csdn.net/sushengmiyan/article/details/38295575 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源  Sencha Cmd官方网站: http://w

转:深度学习课程及深度学习公开课资源整理

http://www.52nlp.cn/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E8%AF%BE%E7%A8%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%85%AC%E5%BC%80%E8%AF%BE%E8%B5%84%E6%BA%90%E6%95%B4%E7%90%86 这里整理一批深度学习课程或者深度学习相关公开课的资源,持续更新,仅供参考. 1. Andrew Ng (吴恩达) 深度学习专项课程 by Courser

【纯干货】教你如何学习嵌入式开发,嵌入式学习路线

很多学习嵌入式设计同学都会发出这样的感慨,"学嵌入式好难啊"!! 这是因为你对学习嵌入式没有掌握一个好的方法,当你掌握了,就会发现其实也很简单,今天我就总结了一些自己的学习方法给新人们参考.其实只要用心,真的很简单! 可能以下的说法您觉得听得次数太多了,但是没什么用,其实真的没用吗,你真的按照你的规划区做了吗? 学好嵌入式的前提: 一.保持良好的心态,不能急于求成.学习嵌入式并不是一朝一夕能够完成的,要一步一个脚印的坚持. 二.要有清晰的学习规划,明确学习步骤,做个计划表,明确先学什么