Skip to content

Commit

Permalink
springside#539 JDK依赖改为JDK7.0+
Browse files Browse the repository at this point in the history
  • Loading branch information
calvin1978 committed Jan 21, 2017
1 parent 157905e commit 684f28d
Show file tree
Hide file tree
Showing 9 changed files with 250 additions and 47 deletions.
8 changes: 5 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ jdk:

install: true
script:
- "cd modules;mvn clean test"
- jdk_switcher use oraclejdk8
- "mvn test"
- "cd modules;mvn clean test"
- jdk_switcher use oraclejdk8
- "mvn clean test"
- mvn clean package -Dmaven.test.skip=true
- jdk_switcher use oraclejdk7
- "mvn test"
- "mvn clean package -Dmaven.test.skip=true"
- jdk_switcher use oraclejdk7
- "mvn test"

Expand Down
4 changes: 2 additions & 2 deletions modules/utils/pom-release.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@
<slf4j.version>1.7.22</slf4j.version>
<logback.version>1.1.8</logback.version>
<junit.version>4.12</junit.version>
<assertj.version>2.2.0</assertj.version>
<assertj.version>2.6.0</assertj.version>
<mockito.version>1.10.19</mockito.version>

<!-- Plugin的属性 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.6</java.version>
<java.version>1.7</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
Expand Down
2 changes: 1 addition & 1 deletion modules/utils/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

<!-- Plugin的属性 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.6</java.version>
<java.version>1.7</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import java.util.Properties;
import java.util.concurrent.CopyOnWriteArrayList;

import org.springside.modules.utils.base.SystemPropertiesUtil.PropertiesListener;
import org.springside.modules.utils.number.NumberUtil;

/**
Expand Down Expand Up @@ -198,7 +197,6 @@ private static void checkEnvName(String envName) {
* Properties 本质上是一个HashTable,每次读写都会加锁,所以不支持频繁的System.getProperty(name)来检查系统内容变化 因此扩展了一个ListenableProperties,
* 在其所关心的属性变化时进行通知.
*
* @see PropertiesUtil#registerSystemPropertiesListener(PropertiesListener)
* @see PropertiesListener
*/
public static class ListenableProperties extends Properties {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ public static <E> ConcurrentLinkedQueue<E> newConcurrentNonBlockingQueue() {
}

/**
* 创建无阻塞情况下,性能最优的并发双端队列 (兼容JDK6的情况)
* 创建无阻塞情况下,性能最优的并发双端队列
*/
public static <E> Deque<E> newConcurrentNonBlockingDeque() {
return new java.util.concurrent.ConcurrentLinkedDeque<E>();
return new java.util.concurrent.ConcurrentLinkedDeque<E>();
}

/**
Expand Down Expand Up @@ -106,8 +106,6 @@ public static <E> Queue<E> createStack(int initSize) {
/**
* 支持后进先出的并发栈,用ConcurrentLinkedDeque实现,经过Collections#asLifoQueue()转换顺序
*
* 兼容了JDK6
*
* 另对于BlockingQueue接口, JDK暂无Lifo倒转实现,因此只能直接使用未调转顺序的LinkedBlockingDeque
*
* @see Collections#asLifoQueue()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
/*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/publicdomain/zero/1.0/
*/

package org.springside.modules.utils.concurrent.jsr166e;

/**
* http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/RecursiveAction.java 1.3
*
* A recursive resultless {@link ForkJoinTask}. This class
* establishes conventions to parameterize resultless actions as
* {@code Void} {@code ForkJoinTask}s. Because {@code null} is the
* only valid value of type {@code Void}, methods such as {@code join}
* always return {@code null} upon completion.
*
* <p><b>Sample Usages.</b> Here is a simple but complete ForkJoin
* sort that sorts a given {@code long[]} array:
*
* <pre> {@code
* static class SortTask extends RecursiveAction {
* final long[] array; final int lo, hi;
* SortTask(long[] array, int lo, int hi) {
* this.array = array; this.lo = lo; this.hi = hi;
* }
* SortTask(long[] array) { this(array, 0, array.length); }
* protected void compute() {
* if (hi - lo < THRESHOLD)
* sortSequentially(lo, hi);
* else {
* int mid = (lo + hi) >>> 1;
* invokeAll(new SortTask(array, lo, mid),
* new SortTask(array, mid, hi));
* merge(lo, mid, hi);
* }
* }
* // implementation details follow:
* static final int THRESHOLD = 1000;
* void sortSequentially(int lo, int hi) {
* Arrays.sort(array, lo, hi);
* }
* void merge(int lo, int mid, int hi) {
* long[] buf = Arrays.copyOfRange(array, lo, mid);
* for (int i = 0, j = lo, k = mid; i < buf.length; j++)
* array[j] = (k == hi || buf[i] < array[k]) ?
* buf[i++] : array[k++];
* }
* }}</pre>
*
* You could then sort {@code anArray} by creating {@code new
* SortTask(anArray)} and invoking it in a ForkJoinPool. As a more
* concrete simple example, the following task increments each element
* of an array:
* <pre> {@code
* class IncrementTask extends RecursiveAction {
* final long[] array; final int lo, hi;
* IncrementTask(long[] array, int lo, int hi) {
* this.array = array; this.lo = lo; this.hi = hi;
* }
* protected void compute() {
* if (hi - lo < THRESHOLD) {
* for (int i = lo; i < hi; ++i)
* array[i]++;
* }
* else {
* int mid = (lo + hi) >>> 1;
* invokeAll(new IncrementTask(array, lo, mid),
* new IncrementTask(array, mid, hi));
* }
* }
* }}</pre>
*
* <p>The following example illustrates some refinements and idioms
* that may lead to better performance: RecursiveActions need not be
* fully recursive, so long as they maintain the basic
* divide-and-conquer approach. Here is a class that sums the squares
* of each element of a double array, by subdividing out only the
* right-hand-sides of repeated divisions by two, and keeping track of
* them with a chain of {@code next} references. It uses a dynamic
* threshold based on method {@code getSurplusQueuedTaskCount}, but
* counterbalances potential excess partitioning by directly
* performing leaf actions on unstolen tasks rather than further
* subdividing.
*
* <pre> {@code
* double sumOfSquares(ForkJoinPool pool, double[] array) {
* int n = array.length;
* Applyer a = new Applyer(array, 0, n, null);
* pool.invoke(a);
* return a.result;
* }
*
* class Applyer extends RecursiveAction {
* final double[] array;
* final int lo, hi;
* double result;
* Applyer next; // keeps track of right-hand-side tasks
* Applyer(double[] array, int lo, int hi, Applyer next) {
* this.array = array; this.lo = lo; this.hi = hi;
* this.next = next;
* }
*
* double atLeaf(int l, int h) {
* double sum = 0;
* for (int i = l; i < h; ++i) // perform leftmost base step
* sum += array[i] * array[i];
* return sum;
* }
*
* protected void compute() {
* int l = lo;
* int h = hi;
* Applyer right = null;
* while (h - l > 1 && getSurplusQueuedTaskCount() <= 3) {
* int mid = (l + h) >>> 1;
* right = new Applyer(array, mid, h, right);
* right.fork();
* h = mid;
* }
* double sum = atLeaf(l, h);
* while (right != null) {
* if (right.tryUnfork()) // directly calculate if not stolen
* sum += right.atLeaf(right.lo, right.hi);
* else {
* right.join();
* sum += right.result;
* }
* right = right.next;
* }
* result = sum;
* }
* }}</pre>
*
* @since 1.7
* @author Doug Lea
*/
public abstract class RecursiveAction extends ForkJoinTask<Void> {
private static final long serialVersionUID = 5232453952276485070L;

/**
* The main computation performed by this task.
*/
protected abstract void compute();

/**
* Always returns {@code null}.
*
* @return {@code null} always
*/
public final Void getRawResult() { return null; }

/**
* Requires null completion value.
*/
protected final void setRawResult(Void mustBeNull) { }

/**
* Implements execution conventions for RecursiveActions.
*/
protected final boolean exec() {
compute();
return true;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/publicdomain/zero/1.0/
*/

package org.springside.modules.utils.concurrent.jsr166e;

/**
* http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/RecursiveTask.java 1.4
*
* A recursive result-bearing {@link ForkJoinTask}.
*
* <p>For a classic example, here is a task computing Fibonacci numbers:
*
* <pre> {@code
* class Fibonacci extends RecursiveTask<Integer> {
* final int n;
* Fibonacci(int n) { this.n = n; }
* protected Integer compute() {
* if (n <= 1)
* return n;
* Fibonacci f1 = new Fibonacci(n - 1);
* f1.fork();
* Fibonacci f2 = new Fibonacci(n - 2);
* return f2.compute() + f1.join();
* }
* }}</pre>
*
* However, besides being a dumb way to compute Fibonacci functions
* (there is a simple fast linear algorithm that you'd use in
* practice), this is likely to perform poorly because the smallest
* subtasks are too small to be worthwhile splitting up. Instead, as
* is the case for nearly all fork/join applications, you'd pick some
* minimum granularity size (for example 10 here) for which you always
* sequentially solve rather than subdividing.
*
* @since 1.7
* @author Doug Lea
*/
public abstract class RecursiveTask<V> extends ForkJoinTask<V> {
private static final long serialVersionUID = 5232453952276485270L;

/**
* The result of the computation.
*/
V result;

/**
* The main computation performed by this task.
* @return the result of the computation
*/
protected abstract V compute();

public final V getRawResult() {
return result;
}

protected final void setRawResult(V value) {
result = value;
}

/**
* Implements execution conventions for RecursiveTask.
*/
protected final boolean exec() {
result = compute();
return true;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipFile;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -60,32 +58,6 @@ public static void closeQuietly(Closeable closeable) {
}
}

/**
* For JDK6 which ZipFile is not Closeable.
*/
public static void closeQuietly(ZipFile zipfile) {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
logger.warn(CLOSE_ERROR_MESSAGE, e);
}
}
}

/**
* For JDK6 which Socket is not Closeable.
*/
public static void closeQuietly(Socket socket) {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
logger.warn(CLOSE_ERROR_MESSAGE, e);
}
}
}

/**
* 简单读取InputStream到String.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@
/**
* 随机数工具集.
*
* 1. 获取无锁的兼容JDK6的ThreadLocalRandom
* 1. 获取无锁的ThreadLocalRandom, 性能较佳的SecureRandom
*
* 2. 获取性能较佳的SecureRandom
*
* 3. 保证没有负数陷阱,也能更精确设定范围的nextInt/nextLong/nextDouble (copy from Common Lang
* 2. 保证没有负数陷阱,也能更精确设定范围的nextInt/nextLong/nextDouble (copy from Common Lang
* RandomUtils,但默认使用性能较优的ThreadLocalRandom,并可配置其他的Random)
*
* 4. 随机字符串
* 3. 随机字符串
*
* @author calvin
*/
Expand All @@ -27,8 +25,6 @@ public abstract class RandomUtil {
/////////////////// 获取Random实例//////////////
/**
* 返回无锁的ThreadLocalRandom
*
* 如果JDK6,使用移植于jsr166e的版本(相当于JDK7的实现)
*/
public static Random threadLocalRandom() {
return java.util.concurrent.ThreadLocalRandom.current();
Expand Down

0 comments on commit 684f28d

Please sign in to comment.