gradle教程
未读1.简介在本教程中,我们将研究如何将Gradle构建文件转换为Maven POM文件。我们还将探讨一些可用的自定义选项。
2. Gradle Build File让我们以一个标准的摇篮Java项目开始,gradle这个对Maven的, 具有以下的build.gradle文件:
12345678910111213repositories { mavenCentral()} group = 'com.daicy'version = '0.0.1-SNAPSHOT' apply plugin: 'java' dependencies { compile('org.slf4j:slf4j-api') testCompile('junit:junit')}
3. Maven插件Gradle附带了Maven插件,该插件增加了将Gradle文件转换为Maven POM文件的支持。它还可以将工件部署到Maven存储库。
要使用此功能,我们将Mav ...
java并发教程
未读Java执行程序框架的好处之一是我们可以运行并发任务,这些并发任务在处理任务后可以返回单个结果。在Java并发 API实现了这一具有以下两个接口Callable和Future。
1. Java Callable和Future接口1.1.CallableCallable接口有call()方法。在这种方法中,我们必须实现任务的逻辑。该Callable接口是一个参数化接口,这意味着我们必须指示该call()方法将返回的数据类型。
2.2.FutureFuture接口具有获取Callable对象生成的结果并管理其状态的方法。
2. Java Callable Future示例在此示例中,我们正在创建FactorialCalculator类型为的Callable。这意味着我们将覆盖它的call()方法,并且在计算之后,我们将从call()方法返回结果。以后可以从Future主程序保存的引用中检索此结果。
12345678910111213141516171819202122232425FactorialCalculator.javapublic class FactorialCalculator ...
java
未读在Java编码中,我们容易犯一些错误,也容易疏忽一些问题,因此笔者对日常编码中曾遇到的一些经典情形归纳整理成文,以共同探讨。
1. 纠结的同名现象
很多类的命名相同(例如:常见于异常、常量、日志等类),导致在import时,有时候张冠李戴,这种错误有时候很隐蔽。因为往往同名的类功能也类似,所以IDE不会提示warn。
解决
写完代码时,扫视下import部分,看看有没有不熟悉的。替换成正确导入后,要注意下注释是否也作相应修改。
启示
命名尽量避开重复名,特别要避开与JDK中的类重名,否则容易导入错,同时存在大量重名类,在查找时,也需要更多的辨别时间。
2. 想当然的API现象
有时候调用API时,会想当然的通过名字直接自信满满地调用,导致很惊讶的一些错误:
示例一:flag是true?
boolean flag = Boolean.getBoolean("true");
可能老是false。
示例二:这是去年的今天吗(今年是2012年)?结果还是2012年:
Calendar calendar = GregorianCalendar.getInstance();
...
java并发教程
未读长期以来,多线程是访问者中非常受欢迎的话题。虽然我个人觉得很少有人真正有机会从事复杂的多线程应用程序的工作(最近7年我只有一次机会),但仍然可以帮助您方便地使用这些概念,仅能增强您的信心。之前,我讨论了一个有关 wait()和sleep()方法之间差异的类似问题,这一次,我正在讨论 join()和yield()方法之间的差异。坦白地说,我在实践中并未同时使用这两种方法,因此,如果您在任何时候都感到不满意,请提出意见。
A little background on java thread scheduling需要Java虚拟机在其各个线程之间实施基于优先级的抢占式调度程序。这意味着为Java程序中的每个线程分配了一定的优先级,该优先级在明确定义的范围内。开发人员可以更改此优先级。Java虚拟机永远不会更改线程的优先级,即使该线程已经运行了一段时间。
优先级值很重要,因为Java虚拟机与基础操作系统之间的约定是,操作系统通常必须选择以最高优先级运行Java线程。这就是说Java实现基于优先级的调度程序时的意思。此调度程序以抢先方式实现,这意味着,当出现更高优先级的线程时,该线程会中断(抢占 ...
二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
首先创建节点类,并在里面添加了一个创建树的方法,调用后就可以返回一个包含7个节点的二叉树。
123456789101112131415161718192021222324252627282930313233343536373839404142434445public class Node { // 节点值 public int value; // 左子节点 public Node left; // 右子节点 public Node right; Node(int va) { value = va; } Node(int va, Node le, Node ri) { value = va; left = ...
java源码分析
未读java.util包中包含了一系列重要的集合类。本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕。
下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理。
本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码。
集合类的根接口CollectionCollection接口是所有集合类的根类型。它的一个主要的接口方法是:
1boolean add(Object c)
add()方法将添加一个新元素。注意这个方法会返回一个boolean,但是返回值不是表示添加成功与否。仔细阅读doc可以看到,Collection规定:如果一个集合拒绝添加这个元素,无论任何原因,都必须抛出异常。这个返回值表示的意义是add()方法执行后,集合的内容是否改变了(就是元素有无数量,位置等变化),这是由具体类实现的。即:如果方法出错,总会抛出异常;返回值仅仅表示该方法执行后这个C ...
java并发教程
未读了解Java中sleep()和wait()方法之间的区别。了解何时使用哪种方法以及它们对Java并发带来什么影响。
1. Java sleep()和wait()–讨论sleep()是一种用于暂停该过程几秒钟或我们想要的时间的方法。但是在使用wait()方法的情况下,线程进入等待状态,直到我们调用notify()or ,线程才会自动返回notifyAll()。
主要区别在于等待wait()时sleep()不释放锁定或监视器,而等待时不释放锁定或监视器。wait()通常用于线程间通信,而sleep()通常用于引入执行暂停。
Thread.sleep()将当前线程发送到“ Not Runnable ”状态一段时间。该线程保留已获取的监视器,即,如果该线程当前在某个synchronized块或方法中,则没有其他线程可以进入该块或方法。如果另一个线程调用t.interrupt()。它将唤醒睡眠线程。
While sleep()是一种static方法,这意味着它始终会影响当前线程(正在执行sleep方法的线程)。一个常见的错误是调用t.sleep()where t是另一个线程。即使这样,当前线程也 ...
markdown
未读[TOC]OverviewNearly all Markdown applications support the basic syntax outlined in John Gruber’s original design document. There are minor variations and discrepancies between Markdown processors — those are noted inline wherever possible.
HeadingsTo create a heading, add number signs (#) in front of a word or phrase. The number of number signs you use should correspond to the heading level. For example, to create a heading level three (<h3>), use three number signs (e.g., ### My Header).
...
作为140个字的缔造者,twitter太简单了,又太复杂了,简单是因为仅仅用140个字居然使有几次世界性事件的传播速度超过任何媒体,复杂是因为要为2亿用户提供这看似简单的140个字的服务,这真的是因为简单,所以复杂。本文就将对twitter网站架构的学习体会来与大家一起分享。
一、twitter网站基本情况概览
截至2011年4月,twitter的注册用户约为1.75亿,并以每天300000的新用户注册数增长,但是其真正的活跃用户远远小于这个数目,大部分注册用户都是没有关注者或没有关注别人的,这也是与facebook的6亿活跃用户不能相提并论的。
twitter每月有180万独立访问用户数,并且75%的流量来自twitter.com以外的网站。每天通过API有30亿次请求,每天平均产生5500次tweet,37%活跃用户为手机用户,约60%的tweet来自第三方的应用。
平台:Ruby on Rails 、Erlang 、MySQL 、Mongrel 、Munin 、Nagios 、Google Analytics 、AWStats 、Memcached
下图是twitter的整体架构 ...
Swing 是一个强大的 GUI 工具包;它可扩展、可配置且跨平台。不过 Swing 的灵活性既是它的主要优势也是它的重大弱点。Swing 可以不同的方式构建同一 UI。例如,您可以使用插页、空白边框或填充符在 GUI 组件之间置入间隔。鉴于 Swing 选项太多,了解现有 GUI 如同编写新 GUI 一样令人畏惧,且将其视觉外观与底层代码对应起来也并非易事。(试着在阅读几个使用 GridBagLayout 的代码行时想象一下 GUI。)
不管您是在维护未曾写过的 Swing GUI 还是集成第三方 GUI 组件到您的应用程序中,理解代码的一种合理方法是编写测试。在编写测试的同时您也就熟悉了未知代码的内部构造。这样做会同时产生另一个有价值的结果,即您最终会有一个测试套件,它有助于在维护代码时预防回归的引入。对于第三方 GUI 组件,测试套件有助于查明新版本的库是否引入了任何行为变化。
一开始最好先编写功能测试,以了解 GUI 如何响应用户输入。为 GUI 编写测试比为非可视化代码编写测试更复杂,因为:
理论上,测试必须是自动化的,但是 GUI 则是供人类 — 而非计算机程序 — 使用 ...
