diff --git a/.gitignore b/.gitignore
index b9d6bd9..9b0c12b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -213,3 +213,12 @@ pip-log.txt
#Mr Developer
.mr.developer.cfg
+
+
+#################
+## IntelliJ IDEA
+#################
+
+*.ipr
+*.iml
+*.iws
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/Aigorithms/pom.xml b/Aigorithms/pom.xml
new file mode 100644
index 0000000..00160ba
--- /dev/null
+++ b/Aigorithms/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Aigorithms
+
+
+
\ No newline at end of file
diff --git a/AndroidTest/pom.xml b/AndroidTest/pom.xml
new file mode 100644
index 0000000..e1154e6
--- /dev/null
+++ b/AndroidTest/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ AndroidTest
+
+
+
+ com.mcxiaoke.volley
+ library
+ 1.0.10
+
+
+
\ No newline at end of file
diff --git a/AndroidTest/src/main/java/com/example/VolleyTest.java b/AndroidTest/src/main/java/com/example/VolleyTest.java
new file mode 100644
index 0000000..7aa81d4
--- /dev/null
+++ b/AndroidTest/src/main/java/com/example/VolleyTest.java
@@ -0,0 +1,30 @@
+package com.example;
+
+import com.android.volley.Response;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.StringRequest;
+
+/**
+ * Created by Loon on 2015/2/3.
+ */
+public class VolleyTest {
+
+ public static void main(String[] args) {
+
+ StringRequest stringRequest = new StringRequest("http://www.baidu.com",
+ new Response.Listener() {
+ @Override
+ public void onResponse(String response) {
+ System.out.println("TAG" + response);
+ }
+ }, new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError error) {
+ System.out.println("TAG" + error.getMessage());
+ }
+ }
+ );
+ }
+
+
+}
diff --git a/Annotation/pom.xml b/Annotation/pom.xml
new file mode 100644
index 0000000..45be743
--- /dev/null
+++ b/Annotation/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Annotation
+
+
+
\ No newline at end of file
diff --git a/BeanValidation/pom.xml b/BeanValidation/pom.xml
new file mode 100644
index 0000000..5bf3bd5
--- /dev/null
+++ b/BeanValidation/pom.xml
@@ -0,0 +1,47 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ BeanValidation
+
+
+
+
+ javax.validation
+ validation-api
+ 1.1.0.Final
+
+
+
+ org.hibernate
+ hibernate-validator
+ 5.1.0.Final
+
+
+
+
+ javax.el
+ javax.el-api
+ 2.2.4
+
+
+ org.glassfish.web
+ javax.el
+ 2.2.4
+
+
+
+ org.hibernate
+ hibernate-validator-cdi
+ 5.1.3.Final
+
+
+
+
\ No newline at end of file
diff --git a/BeanValidation/src/main/java/com/loon/exp001/Teacher.java b/BeanValidation/src/main/java/com/loon/exp001/Teacher.java
new file mode 100644
index 0000000..c36b3c2
--- /dev/null
+++ b/BeanValidation/src/main/java/com/loon/exp001/Teacher.java
@@ -0,0 +1,103 @@
+package com.loon.exp001;
+
+import com.google.common.base.Objects;
+
+import javax.validation.constraints.Future;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Past;
+import javax.validation.constraints.Pattern;
+import java.util.Date;
+
+/**
+ * Created by Loon on 2014/12/12.
+ */
+public class Teacher {
+ @NotNull
+ private String name;
+ @NotNull
+ private int age;
+ @Past
+ private Date birthday;
+ @Future
+ private Date eventDate;
+ @Pattern(regexp = "\\(\\d{3}\\)\\d{3}-\\d{4}")
+ private String phoneNumber;
+
+ public Teacher() {
+ }
+
+ public Teacher(String name, int age, Date birthday, Date eventDate, String phoneNumber) {
+ this.name = name;
+ this.age = age;
+ this.birthday = birthday;
+ this.eventDate = eventDate;
+ this.phoneNumber = phoneNumber;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public Date getEventDate() {
+ return eventDate;
+ }
+
+ public void setEventDate(Date eventDate) {
+ this.eventDate = eventDate;
+ }
+
+ public String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this)
+ .add("name", name)
+ .add("age", age)
+ .add("birthday", birthday)
+ .add("eventDate", eventDate)
+ .add("phoneNumber", phoneNumber)
+ .toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Teacher teacher = (Teacher) o;
+
+ return phoneNumber.equals(teacher.phoneNumber);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return phoneNumber.hashCode();
+ }
+}
diff --git a/BeanValidation/src/test/TeacherTest.java b/BeanValidation/src/test/TeacherTest.java
new file mode 100644
index 0000000..8a2f13f
--- /dev/null
+++ b/BeanValidation/src/test/TeacherTest.java
@@ -0,0 +1,39 @@
+import com.loon.exp001.Teacher;
+import org.joda.time.DateTime;
+import org.joda.time.format.ISODateTimeFormat;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+public class TeacherTest {
+
+ private static Validator validator;
+
+ @Before
+ public void setUp() {
+ ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+ validator = factory.getValidator();
+ }
+
+ @Test
+ public void test() {
+
+ Teacher teacher = new Teacher();
+ teacher.setAge(0);
+ teacher.setBirthday(DateTime.parse("2015-12-12", ISODateTimeFormat.yearMonthDay()).toDate());
+ teacher.setEventDate(DateTime.now().minusDays(100).toDate());
+ teacher.setName("test");
+ teacher.setPhoneNumber("1");
+
+ Set> constraintViolations = validator.validate(teacher);
+
+ assertEquals(0, constraintViolations.size());
+ }
+}
\ No newline at end of file
diff --git a/Collection/Collection.iml b/Collection/Collection.iml
index c46d21f..0696add 100644
--- a/Collection/Collection.iml
+++ b/Collection/Collection.iml
@@ -1,16 +1,26 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/Collection/pom.xml b/Collection/pom.xml
new file mode 100644
index 0000000..439ac89
--- /dev/null
+++ b/Collection/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+
+ Collection
+ 1.0-SNAPSHOT
+
+
\ No newline at end of file
diff --git a/Collection/src/main/java/com/example/deque/Deque1.java b/Collection/src/main/java/com/example/deque/Deque1.java
new file mode 100644
index 0000000..df83aba
--- /dev/null
+++ b/Collection/src/main/java/com/example/deque/Deque1.java
@@ -0,0 +1,51 @@
+package com.example.deque;
+
+import java.util.*;
+
+/**
+ * Created by Loon on 2014/4/23.
+ * 双向队列
+ * @link http://www.stanford.edu/group/coursework/docsTech/jgl/api/com.objectspace.jgl.examples.DequeExamples.html
+ */
+public class Deque1 {
+
+ public static void main(String[] args) {
+ Deque deque = new ArrayDeque();
+ deque.addLast("bat");
+ deque.add("cat");
+ deque.addFirst("ape");
+ System.out.println(deque);
+ System.out.println();
+
+ System.out.println("Enumerate the Deque");
+ Enumeration e = Collections.enumeration(deque);
+ while (e.hasMoreElements())
+ System.out.println(e.nextElement());
+ System.out.println();
+
+ System.out.println("Iterate through the Deque");
+ for (Iterator iter = deque.descendingIterator(); iter.hasNext(); ) {
+ System.out.println(iter.next());
+ }
+ System.out.println();
+
+
+ System.out.println("Demonstrate access");
+ System.out.println("deque.getFirst() = " + deque.getFirst());
+ System.out.println("find if element exists in deque " + deque.contains("ape"));
+ System.out.println("find element in deque " + deque.contains("ape1"));
+ System.out.println("deque.element() = " + deque.element());
+ System.out.println("deque.getLast() = " + deque.getLast());
+ System.out.println();
+
+ System.out.println("Demonstrate modification");
+ deque.push("fox");
+ System.out.println(deque);
+
+ deque.removeFirst();
+ System.out.println("After popFront() = " + deque);
+
+ deque.removeLast();
+ System.out.println("After popBack() = " + deque);
+ }
+}
diff --git a/Common/pom.xml b/Common/pom.xml
new file mode 100644
index 0000000..0f25296
--- /dev/null
+++ b/Common/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+
+ Common
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.3.2
+
+
+
+ org.springframework
+ spring-core
+ 4.1.0.RELEASE
+
+
+
+ com.belerweb
+ pinyin4j
+ 2.5.0
+
+
+
+
+
\ No newline at end of file
diff --git a/Common/src/main/java/com/loon/comparator/PinyinComparator.java b/Common/src/main/java/com/loon/comparator/PinyinComparator.java
new file mode 100644
index 0000000..d003f2d
--- /dev/null
+++ b/Common/src/main/java/com/loon/comparator/PinyinComparator.java
@@ -0,0 +1,14 @@
+package com.loon.comparator;
+
+import java.text.Collator;
+import java.util.Comparator;
+import java.util.Locale;
+
+/**
+ * Created by Loon on 2015/11/13.
+ */
+public class PinyinComparator implements Comparator {
+ public int compare(String o1, String o2) {
+ return Collator.getInstance(Locale.SIMPLIFIED_CHINESE).compare(o1, o2);
+ }
+}
diff --git a/Util/src/main/java/LearningCalendar.java b/Common/src/main/java/com/loon/date/LearningCalendar.java
similarity index 99%
rename from Util/src/main/java/LearningCalendar.java
rename to Common/src/main/java/com/loon/date/LearningCalendar.java
index c535e19..76632a8 100644
--- a/Util/src/main/java/LearningCalendar.java
+++ b/Common/src/main/java/com/loon/date/LearningCalendar.java
@@ -1,3 +1,5 @@
+package com.loon.date;
+
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
diff --git a/Common/src/main/java/com/loon/date/joda/FormatDate.java b/Common/src/main/java/com/loon/date/joda/FormatDate.java
new file mode 100644
index 0000000..a197c1b
--- /dev/null
+++ b/Common/src/main/java/com/loon/date/joda/FormatDate.java
@@ -0,0 +1,66 @@
+package com.loon.date.joda;
+
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalTime;
+import org.joda.time.format.*;
+
+import java.util.Date;
+
+/**
+ * Created by Loon on 2016/5/24.
+ */
+public class FormatDate {
+
+ public static void main(String[] args) {
+
+ LocalDate localDate = LocalDate.now();
+ System.out.println(localDate.toString()); // 2016-05-24
+ DateTimeFormatter fmt = DateTimeFormat.forPattern("d MMMM, yyyy");
+ System.out.println(localDate.toString(fmt)); //24 五月, 2016
+
+ LocalTime localTime =LocalTime.now();
+ System.out.println(localTime); // 12:54:01.173
+
+ DateTime dateTime =DateTime.now();
+ System.out.println(dateTime); // 2016-05-24T12:54:01.190+08:00
+
+
+ Date date = new Date();
+ System.out.println(date);// Tue May 24 12:54:01 CST 2016
+
+
+ System.out.println(dateTime.toString(DateTimeFormat.fullDate())); // 2016年5月24日 星期二
+ System.out.println(dateTime.toString(DateTimeFormat.longDate())); // 2016年5月24日
+ System.out.println(dateTime.toString(DateTimeFormat.mediumTime()));// 12:54:01
+ System.out.println(dateTime.toString(DateTimeFormat.mediumDate()));// 2016-5-24
+
+ DateTimeFormatter monthAndYear = new DateTimeFormatterBuilder()
+ .appendMonthOfYearText()
+ .appendLiteral(' ')
+ .appendYear(4, 4)
+ .toFormatter();
+ System.out.println(dateTime.toString(monthAndYear));// 五月 2016
+
+
+ System.out.println(dateTime.toString(ISODateTimeFormat.basicDate())); // 20160524
+ System.out.println(dateTime.toString(ISODateTimeFormat.basicOrdinalDate())); // 2016145
+ System.out.println(dateTime.toString(ISODateTimeFormat.basicWeekDateTime()));// 2016W212T130215.251+0800
+ System.out.println(dateTime.toString(ISODateTimeFormat.hourMinuteSecondFraction()));// 13:02:15.251
+
+ System.out.println(new DateTime(date).toString(DateTimeFormat.mediumDateTime())); // 2016-5-24 13:04:50
+ System.out.println(new DateTime(date).toString(DateTimeFormat.shortDate())); // 16-5-24
+
+
+
+
+ DateTimeFormatter dayAndMonth = new DateTimeFormatterBuilder()
+ .appendMonthOfYear(0)
+ .appendLiteral('/')
+ .appendDayOfMonth(0)
+ .toFormatter();
+
+ System.out.println(dateTime.toString(dayAndMonth));
+
+ }
+}
diff --git a/Common/src/main/java/com/loon/lineNumber/LineNo.java b/Common/src/main/java/com/loon/lineNumber/LineNo.java
new file mode 100644
index 0000000..e479b47
--- /dev/null
+++ b/Common/src/main/java/com/loon/lineNumber/LineNo.java
@@ -0,0 +1,22 @@
+package com.loon.lineNumber;
+
+/**
+ * 获取文件名称,行号
+ *
+ * @link http://www.coolside.cn/?p=59
+ * Created by Loon on 2014/11/25.
+ */
+public class LineNo {
+
+ public static int getLineNumber() {
+ return Thread.currentThread().getStackTrace()[2].getLineNumber();
+ }
+
+ public static String getFileName() {
+ return Thread.currentThread().getStackTrace()[2].getFileName();
+ }
+
+ public static void main(String args[]) {
+ System.out.println("[" + getFileName() + ":" + getLineNumber() + "]" + "Hello World!");
+ }
+}
diff --git a/Util/src/main/java/FormatterDemo.java b/Common/src/main/java/com/loon/pattern/FormatterDemo.java
similarity index 94%
rename from Util/src/main/java/FormatterDemo.java
rename to Common/src/main/java/com/loon/pattern/FormatterDemo.java
index 973f7e6..26d9638 100644
--- a/Util/src/main/java/FormatterDemo.java
+++ b/Common/src/main/java/com/loon/pattern/FormatterDemo.java
@@ -1,3 +1,5 @@
+package com.loon.pattern;
+
import java.util.Formatter;
/**
diff --git a/Common/src/main/java/com/loon/pattern/PatternLeaning.java b/Common/src/main/java/com/loon/pattern/PatternLeaning.java
new file mode 100644
index 0000000..06a67b5
--- /dev/null
+++ b/Common/src/main/java/com/loon/pattern/PatternLeaning.java
@@ -0,0 +1,45 @@
+package com.loon.pattern;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by Loon on 2015/11/10.
+ */
+public class PatternLeaning {
+
+ public static void main(String[] args) {
+
+ String aa ="\\d";
+
+ Pattern pattern = Pattern.compile(aa);
+
+ System.out.println(replaceMatcherString("aadsf111d111s",pattern)) ;
+ System.out.println(getMatcherString("aadsf111ds1",pattern));
+ }
+
+ private static String getMatcherString(String str, Pattern pattern) {
+
+ StringBuilder stringBuilder = new StringBuilder();
+ Matcher matcher = pattern.matcher(str);
+
+ while(matcher.find()){
+ stringBuilder.append(matcher.group());
+ }
+
+ return stringBuilder.toString();
+ }
+
+ private static String replaceMatcherString(String str, Pattern pattern) {
+
+ StringBuffer stringBuffer = new StringBuffer();
+ Matcher matcher = pattern.matcher(str);
+
+ while(matcher.find()){
+ matcher.appendReplacement(stringBuffer,"");
+ }
+ matcher.appendTail(stringBuffer);
+
+ return stringBuffer.toString();
+ }
+}
diff --git a/Concurrency/Concurrency.iml b/Concurrency/Concurrency.iml
index 1f02819..aa9a011 100644
--- a/Concurrency/Concurrency.iml
+++ b/Concurrency/Concurrency.iml
@@ -1,16 +1,27 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/Concurrency/pom.xml b/Concurrency/pom.xml
index 6d7caf3..20dcd38 100644
--- a/Concurrency/pom.xml
+++ b/Concurrency/pom.xml
@@ -1,12 +1,16 @@
-
4.0.0
- Concurrency
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+
Concurrency
1.0-SNAPSHOT
-
\ No newline at end of file
diff --git a/Concurrency/src/main/java/CallableDemo.java b/Concurrency/src/main/java/CallableDemo.java
index d82dd6e..8008a8c 100644
--- a/Concurrency/src/main/java/CallableDemo.java
+++ b/Concurrency/src/main/java/CallableDemo.java
@@ -21,9 +21,9 @@ public static void main(String[] args) {
try {
System.out.println(str.get());
} catch (InterruptedException e) {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ e.printStackTrace();
} catch (ExecutionException e) {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ e.printStackTrace();
} finally {
executorService.shutdown();
}
diff --git a/Concurrency/src/main/java/com/example/Counter/CountTest.java b/Concurrency/src/main/java/com/example/Counter/CountTest.java
new file mode 100644
index 0000000..a3c7d8a
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/Counter/CountTest.java
@@ -0,0 +1,71 @@
+package com.example.Counter;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by Loon on 2014/6/12.
+ */
+
+public class CountTest {
+
+ public static void main(String[] args) throws InterruptedException {
+
+ final Count counter = new Count();
+
+ // create 1000 threads
+ ArrayList threads = new ArrayList();
+ for (int x = 0; x < 1000; x++) {
+ threads.add(new MyThread(counter));
+ }
+
+ // start all of the threads
+ Iterator i1 = threads.iterator();
+ while (i1.hasNext()) {
+ MyThread mt = (MyThread) i1.next();
+ mt.start();
+ }
+
+ // wait for all the threads to finish
+ Iterator i2 = threads.iterator();
+ while (i2.hasNext()) {
+ MyThread mt = (MyThread) i2.next();
+ mt.join();
+ }
+
+ System.out.println("Count: " + counter.getCount());
+ }
+}
+
+// thread that increments the counter 100000 times.
+class MyThread extends Thread {
+ Count counter;
+
+ MyThread(Count counter) {
+ this.counter = counter;
+ }
+
+ public void run() {
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ counter.incrementCount();
+ }
+}
+
+// class that uses AtomicInteger for counter
+class Count {
+
+ private AtomicInteger count = new AtomicInteger(0);
+
+ public void incrementCount() {
+ count.incrementAndGet();
+ }
+
+ public int getCount() {
+ return count.get();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/Counter/Counter.java b/Concurrency/src/main/java/com/example/Counter/Counter.java
new file mode 100644
index 0000000..3eed014
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/Counter/Counter.java
@@ -0,0 +1,40 @@
+package com.example.Counter;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Created by Loon on 2014/6/13.
+ */
+public class Counter {
+
+ private static AtomicLong currentValue = new AtomicLong(0); // 当前值
+ private static Long count; // 总数
+
+ public static void init(Long count) {
+ Counter.currentValue = new AtomicLong(0);
+ Counter.count = count;
+ //System.out.println("===========" + currentValue);
+ }
+
+
+ /**
+ * 获取当前进程值
+ *
+ * @return 进程值
+ */
+ public static double getProgressValue() {
+ //System.out.println(currentValue + "+++++++++++" + count);
+ return currentValue.doubleValue() / count.doubleValue();
+ }
+
+ /**
+ * 对计数器进行加一
+ */
+ public static void plusOne() {
+ currentValue.incrementAndGet();
+ }
+
+ public static void plusMany(long value) {
+ currentValue.addAndGet(value);
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/Counter/Counter3.java b/Concurrency/src/main/java/com/example/Counter/Counter3.java
new file mode 100644
index 0000000..fa57cd4
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/Counter/Counter3.java
@@ -0,0 +1,36 @@
+package com.example.Counter;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by Loon on 2014/6/13.
+ */
+public class Counter3 {
+ public static void main(String[] args) throws InterruptedException {
+
+ final AtomicInteger count = new AtomicInteger(0);
+ ExecutorService executor = Executors.newFixedThreadPool(10);
+
+ for (int i = 0; i < 1000; i++) {
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ TimeUnit.MILLISECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ count.incrementAndGet();
+ }
+ });
+ }
+ executor.shutdown();
+ executor.awaitTermination(10, TimeUnit.SECONDS);
+ System.out.printf("count " + count.get());
+
+ }
+
+}
diff --git a/Concurrency/src/main/java/com/example/Counter/CounterTest.java b/Concurrency/src/main/java/com/example/Counter/CounterTest.java
new file mode 100644
index 0000000..da84cf9
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/Counter/CounterTest.java
@@ -0,0 +1,54 @@
+package com.example.Counter;
+
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+
+public class CounterTest {
+
+
+ public static void main(String[] args) {
+
+ Counter.init(Long.valueOf(100));
+
+ ExecutorService executor = Executors.newFixedThreadPool(1000);
+
+
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ while (true) {
+ System.out.println("count " + Counter.getProgressValue());
+ }
+ }
+ });
+
+ for (int i = 0; i < 10; i++) {
+
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ for (int j = 0; j < 10; j++) {
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ Counter.plusOne();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ });
+
+ }
+
+
+ executor.shutdown();
+ System.out.printf("count " + Counter.getProgressValue());
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Concurrency/src/main/java/com/example/chapter1/Calculator.java b/Concurrency/src/main/java/com/example/chapter1/Calculator.java
new file mode 100644
index 0000000..6f83e8d
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/Calculator.java
@@ -0,0 +1,27 @@
+package com.example.chapter1;
+
+
+public class Calculator implements Runnable {
+
+ private int number;
+
+ public Calculator(int number) {
+ this.number = number;
+ }
+
+ public static void main(String[] args) {
+ for (int i = 1; i <= 10; i++) {
+ Calculator calculator = new Calculator(i);
+ Thread thread = new Thread(calculator);
+ thread.start();
+ }
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 10; i++) {
+ System.out.printf("%s: %d * %d = %d\n", Thread.currentThread().getName(), number, i, i * number);
+ }
+ }
+}
+
diff --git a/Concurrency/src/main/java/com/example/chapter1/DataSourcesLoader.java b/Concurrency/src/main/java/com/example/chapter1/DataSourcesLoader.java
new file mode 100644
index 0000000..d592f4b
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/DataSourcesLoader.java
@@ -0,0 +1,41 @@
+package com.example.chapter1;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/22.
+ * source:http://ifeve.com/thread-management-7/
+ */
+public class DataSourcesLoader implements Runnable {
+ public static void main(String[] args) {
+ DataSourcesLoader dsLoader = new DataSourcesLoader();
+ Thread thread1 = new Thread(dsLoader, "DataSourceThread");
+
+ NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
+ Thread thread2 = new Thread(ncLoader, "NetworkConnectionLoad er");
+
+ thread1.start();
+ thread2.start();
+
+ try {
+ thread1.join();
+ thread2.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ System.out.printf("Main: Configuration has been loaded: %s\n", new Date());
+ }
+
+ @Override
+ public void run() {
+ System.out.printf("Beginning data sources loading: %s\n", new Date());
+ try {
+ TimeUnit.SECONDS.sleep(4);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.printf("Data sources loading has finished:%s\n", new Date());
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/FileSearch.java b/Concurrency/src/main/java/com/example/chapter1/FileSearch.java
new file mode 100644
index 0000000..295a85e
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/FileSearch.java
@@ -0,0 +1,72 @@
+package com.example.chapter1;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/22.
+ */
+public class FileSearch implements Runnable {
+
+ private String initPath;
+ private String fileName;
+
+ public FileSearch(String initPath, String fileName) {
+ this.initPath = initPath;
+ this.fileName = fileName;
+ }
+
+ public static void main(String[] args) {
+ FileSearch fileSearch = new FileSearch("D:\\other\\LearnJava\\", "nio-data.txt");
+ Thread thread = new Thread(fileSearch);
+ thread.start();
+
+ try {
+ TimeUnit.SECONDS.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ thread.interrupt();
+ }
+
+ @Override
+ public void run() {
+ File file = new File(initPath);
+ if (file.isDirectory()) {
+ try {
+ directoryProcess(file);
+ } catch (InterruptedException e) {
+ System.out.printf("%s: The search has been interrupted", Thread.currentThread().getName());
+ }
+ }
+ }
+
+ private void directoryProcess(File file) throws InterruptedException {
+ File list[] = file.listFiles();
+ if (list != null || list.length == 0) {
+ return;
+ }
+
+ for (File aList : list) {
+ if (aList.isDirectory()) {
+ directoryProcess(aList);
+ } else {
+ fileProcess(aList);
+ }
+ }
+ if (Thread.interrupted()) {
+ throw new InterruptedException();
+ }
+ }
+
+ private void fileProcess(File file) throws InterruptedException {
+ if (file.getName().equals(fileName)) {
+ System.out.printf("%s : %s\n", Thread.currentThread().getName(), file.getAbsolutePath());
+ }
+ if (Thread.interrupted()) {
+ throw new InterruptedException();
+ }
+ }
+}
+
+
diff --git a/Concurrency/src/main/java/com/example/chapter1/NetworkConnectionsLoader.java b/Concurrency/src/main/java/com/example/chapter1/NetworkConnectionsLoader.java
new file mode 100644
index 0000000..78fbb93
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/NetworkConnectionsLoader.java
@@ -0,0 +1,20 @@
+package com.example.chapter1;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/22.
+ */
+public class NetworkConnectionsLoader implements Runnable {
+ @Override
+ public void run() {
+ System.out.printf("Beginning netWork Connect loading: %s\n", new Date());
+ try {
+ TimeUnit.SECONDS.sleep(6);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.printf("netWork Connect loading has finished:%s\n", new Date());
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/ThreadInterruptedExample.java b/Concurrency/src/main/java/com/example/chapter1/ThreadInterruptedExample.java
new file mode 100644
index 0000000..b53f3b9
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/ThreadInterruptedExample.java
@@ -0,0 +1,20 @@
+package com.example.chapter1;
+
+/**
+ * Created by Loon on 2014/4/22.
+ */
+public class ThreadInterruptedExample extends Thread {
+
+ public static void main(String[] args) {
+ Thread thread = new ThreadInterruptedExample();
+ thread.start();
+ System.out.println(thread.isInterrupted());
+ thread.interrupt();
+ System.out.println(thread.isInterrupted());
+ }
+
+ @Override
+ public void run() {
+ System.out.println(System.currentTimeMillis());
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/ThreadStatus.java b/Concurrency/src/main/java/com/example/chapter1/ThreadStatus.java
new file mode 100644
index 0000000..c1b5f82
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/ThreadStatus.java
@@ -0,0 +1,85 @@
+package com.example.chapter1;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+/**
+ * Created by Loon on 2014/4/22.
+ */
+public class ThreadStatus implements Runnable {
+
+ private int number;
+
+ public ThreadStatus(int number) {
+ this.number = number;
+ }
+
+ public static void main(String[] args) throws URISyntaxException, IOException {
+
+ Thread threads[] = new Thread[10];
+ Thread.State status[] = new Thread.State[10];
+
+ URL url = Resources.getResource("nio-data.txt");
+ File file = new File(url.getFile());
+
+ for (int i = 0; i < 10; i++) {
+ threads[i] = new Thread(new ThreadStatus(i));
+ if ((i % 2) == 0) {
+ threads[i].setPriority(Thread.MAX_PRIORITY);
+ } else {
+ threads[i].setPriority(Thread.MIN_PRIORITY);
+ }
+ threads[i].setName("Thread " + i);
+ fileAppend(file, "Main : Status of Thread " + i + " : " + threads[i].getState() + System.getProperty("line.separator"));
+ status[i] = threads[i].getState();
+ }
+
+ for (int i = 0; i < 10; i++) {
+ threads[i].start();
+ }
+
+
+ boolean finish = false;
+ while (!finish) {
+ for (int i = 0; i < 10; i++) {
+ if (threads[i].getState() != status[i]) {
+ writeThreadInfo(file, threads[i], status[i]);
+ status[i] = threads[i].getState();
+ }
+ }
+
+ finish = true;
+ for (int i = 0; i < 10; i++) {
+ finish = finish && (threads[i].getState() == Thread.State.TERMINATED);
+ }
+ }
+
+ }
+
+ private static void writeThreadInfo(File file, Thread thread, Thread.State state) throws IOException {
+
+ // 使用 StandardSystemProperty.LINE_SEPARATOR 出错
+ fileAppend(file, String.format("Main : Id %d - %s", thread.getId(), thread.getName()) + System.getProperty("line.separator"));
+ fileAppend(file, String.format("Main : Priority: %d", thread.getPriority()) + System.getProperty("line.separator"));
+ fileAppend(file, String.format("Main : Old State: %s", state) + System.getProperty("line.separator"));
+ fileAppend(file, String.format("Main : New State: %s", thread.getState()) + System.getProperty("line.separator"));
+ fileAppend(file, "Main : ************************************" + System.getProperty("line.separator"));
+ }
+
+ private static void fileAppend(File file, String context) throws IOException {
+ Files.append(context, file, Charsets.UTF_8);
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i <= 10; i++) {
+ System.out.printf("%s: %d * %d = %d\n", Thread.currentThread().getName(), number, i, i * number);
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/cancelTask/Main.java b/Concurrency/src/main/java/com/example/chapter1/cancelTask/Main.java
new file mode 100644
index 0000000..bd3fada
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/cancelTask/Main.java
@@ -0,0 +1,38 @@
+package com.example.chapter1.cancelTask;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * @link http://ifeve.com/thread-executors-9/
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
+
+ Task task = new Task();
+ System.out.printf("Main: Executing the Task\n");
+ Future result = executor.submit(task);
+
+ try {
+ TimeUnit.SECONDS.sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ System.out.printf("Main: Canceling the Task\n");
+ result.cancel(true);
+
+ System.out.printf("Main: Canceled: %s\n", result.isCancelled());
+ System.out.printf("Main: Done: %s\n", result.isDone());
+
+ executor.shutdown();
+ System.out.printf("Main: The executor has finished\n");
+
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/cancelTask/Task.java b/Concurrency/src/main/java/com/example/chapter1/cancelTask/Task.java
new file mode 100644
index 0000000..84a0afc
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/cancelTask/Task.java
@@ -0,0 +1,19 @@
+package com.example.chapter1.cancelTask;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * @link http://ifeve.com/thread-executors-9/
+ */
+public class Task implements Callable {
+ @Override
+ public String call() throws Exception {
+ while (true) {
+ System.out.printf("Task: Test\n");
+ TimeUnit.MILLISECONDS.sleep(100);
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/daemonExample/CleanerTask.java b/Concurrency/src/main/java/com/example/chapter1/daemonExample/CleanerTask.java
new file mode 100644
index 0000000..09bede4
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/daemonExample/CleanerTask.java
@@ -0,0 +1,46 @@
+package com.example.chapter1.daemonExample;
+
+import java.util.Date;
+import java.util.Deque;
+
+/**
+ * Created by Loon on 2014/4/23.
+ */
+public class CleanerTask extends Thread {
+
+ private Deque deque;
+
+ public CleanerTask(Deque deque) {
+ this.deque = deque;
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ Date date = new Date();
+ clean(date);
+ }
+ }
+
+ private void clean(Date date) {
+ long difference;
+ boolean delete;
+ if (deque.size() == 0) {
+ return;
+ }
+ delete = false;
+ do {
+ Event e = deque.getLast();
+ difference = date.getTime() - e.getDate().getTime();
+ if (difference > 10000) {
+ System.out.printf("Cleaner: %s\n", e.getEvent());
+ deque.removeLast();
+ delete = true;
+ }
+ } while (difference > 10000);
+ if (delete) {
+ System.out.printf("Cleaner: Size of the queue: %d\n", deque.size());
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/daemonExample/Event.java b/Concurrency/src/main/java/com/example/chapter1/daemonExample/Event.java
new file mode 100644
index 0000000..37d9743
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/daemonExample/Event.java
@@ -0,0 +1,28 @@
+package com.example.chapter1.daemonExample;
+
+import java.util.Date;
+
+/**
+ * Created by Loon on 2014/4/23.
+ */
+public class Event {
+
+ protected Date date;
+ private String event;
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public String getEvent() {
+ return event;
+ }
+
+ public void setEvent(String event) {
+ this.event = event;
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/daemonExample/Main.java b/Concurrency/src/main/java/com/example/chapter1/daemonExample/Main.java
new file mode 100644
index 0000000..ddc2cb1
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/daemonExample/Main.java
@@ -0,0 +1,24 @@
+package com.example.chapter1.daemonExample;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+/**
+ * Created by Loon on 2014/4/23.
+ * 当守护线程是程序里唯一在运行的线程时,JVM会结束守护线程并终止程序。
+ *
+ * @link http://ifeve.com/thread-management-8/
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ Deque deque = new ArrayDeque();
+ WriterTask writer = new WriterTask(deque);
+ for (int i = 0; i < 3; i++) {
+ Thread thread = new Thread(writer);
+ thread.start();
+ }
+ CleanerTask cleaner = new CleanerTask(deque);
+ cleaner.start();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/daemonExample/WriterTask.java b/Concurrency/src/main/java/com/example/chapter1/daemonExample/WriterTask.java
new file mode 100644
index 0000000..6c8a0bf
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/daemonExample/WriterTask.java
@@ -0,0 +1,32 @@
+package com.example.chapter1.daemonExample;
+
+import java.util.Date;
+import java.util.Deque;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/23.
+ */
+public class WriterTask implements Runnable {
+
+ private Deque deque;
+
+ public WriterTask(Deque deque) {
+ this.deque = deque;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 1; i < 20; i++) {
+ Event event = new Event();
+ event.setDate(new Date());
+ event.setEvent(String.format("The thread %s has generated an event", Thread.currentThread().getId()));
+ deque.addFirst(event);
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/ExceptionHandler.java b/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/ExceptionHandler.java
new file mode 100644
index 0000000..abd6671
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/ExceptionHandler.java
@@ -0,0 +1,16 @@
+package com.example.chapter1.exceptionHandler;
+
+/**
+ * Created by Loon on 2014/4/23.
+ */
+public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
+ @Override
+ public void uncaughtException(Thread t, Throwable e) {
+ System.out.printf("An exception has been captured\n");
+ System.out.printf("Thread: %s\n", t.getId());
+ System.out.printf("Exception: %s: %s\n", e.getClass().getName(), e.getMessage());
+ System.out.printf("Stack Trace: \n");
+ e.printStackTrace(System.out);
+ System.out.printf("Thread status: %s\n", t.getState());
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/Main.java b/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/Main.java
new file mode 100644
index 0000000..07ff601
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/Main.java
@@ -0,0 +1,26 @@
+package com.example.chapter1.exceptionHandler;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * The Thread 类有其他相关方法可以处理未捕获的异常。静态方法 setDefaultUncaughtExceptionHandler()
+ * 为应用里的所有线程对象建立异常 handler 。当一个未捕捉的异常在线程里被抛出,JVM会寻找此异常的3种可能
+ * 潜在的处理者(handler)。
+ *
+ * 首先, 它寻找这个未捕捉的线程对象的异常handle,如我们在在这个指南中学习的。
+ * 如果这个handle 不存在,那么JVM会在线程对象的ThreadGroup里寻找非捕捉异常的handler,
+ * 如在处理线程组内的不受控制异常里介绍的那样。如果此方法不存在,正如我们在这个指南中学习的,那么 JVM 会寻找默认非捕捉异常handle。
+ *
+ * 如果没有一个handler存在, 那么 JVM会把异常的 stack trace 写入操控台并结束任务。
+ *
+ * @link http://ifeve.com/thread-management-9/
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ Task task = new Task();
+ Thread thread = new Thread(task);
+ thread.setUncaughtExceptionHandler(new ExceptionHandler()); // 设置异常的处理程序
+ thread.start();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/Task.java b/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/Task.java
new file mode 100644
index 0000000..c81d4b1
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/exceptionHandler/Task.java
@@ -0,0 +1,11 @@
+package com.example.chapter1.exceptionHandler;
+
+/**
+ * Created by Loon on 2014/4/23.
+ */
+public class Task implements Runnable {
+ @Override
+ public void run() {
+ int numero = Integer.parseInt("TTT");
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/interruptExample/FileClock.java b/Concurrency/src/main/java/com/example/chapter1/interruptExample/FileClock.java
new file mode 100644
index 0000000..803d97f
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/interruptExample/FileClock.java
@@ -0,0 +1,39 @@
+package com.example.chapter1.interruptExample;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/22.
+ */
+public class FileClock implements Runnable {
+ public static void main(String[] args) throws InterruptedException {
+ FileClock fileClock = new FileClock();
+ Thread thread = new Thread(fileClock);
+ thread.start();
+
+ /**
+ * sleep响应interrupt的操作包括清除中断状态,抛出InterruptedException,
+ * 一般说来,如果一个方法声明抛出InterruptedException,表示该方法是可中断的(没有在方法中处理中断却也声明
+ * 抛出InterruptedException的除外),也就是说可中断方法会对interrupt调用做出响应(例如sleep响应interrupt的操作
+ * 包括清除中断状态,抛出InterruptedException),如果interrupt调用是在可中断方法之前调用,可中断方法一定会处理
+ * 中断,
+ */
+ TimeUnit.SECONDS.sleep(5);
+
+ thread.interrupt();
+
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 10; i++) {
+ System.out.printf("%s\n", new Date());
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ System.out.printf("The FileClock has been interrupted");
+ }
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt.java b/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt.java
new file mode 100644
index 0000000..1071145
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt.java
@@ -0,0 +1,32 @@
+package com.example.chapter1.interruptExample;
+
+/**
+ * Created by Loon on 2014/4/23.
+ * sources:http://blog.csdn.net/vernonzheng/article/details/8249577
+ */
+public class TestInterrupt {
+
+ public static void main(String[] args) {
+ MyThread myThread = new MyThread();
+ myThread.start();
+ myThread.interrupt();
+ System.out.println(" Thread Status :" + myThread.isInterrupted());
+ }
+
+ static class MyThread extends Thread {
+ private static int longTimeRunningNonInterruptMethod(int count, int initNum) {
+ for (int i = 0; i < count; i++) {
+ for (int j = 0; j < Integer.MAX_VALUE; j++) {
+ initNum++;
+ }
+ }
+ return initNum;
+ }
+
+ public void run() {
+ int num = longTimeRunningNonInterruptMethod(2, 0);
+ System.out.println("长时间任务运行结束,num=" + num);
+ System.out.println("线程的中断状态:" + Thread.interrupted());
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt2.java b/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt2.java
new file mode 100644
index 0000000..496a4ce
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt2.java
@@ -0,0 +1,38 @@
+package com.example.chapter1.interruptExample;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * @link http://blog.csdn.net/vernonzheng/article/details/8249577
+ */
+public class TestInterrupt2 {
+ public static void main(String[] args) {
+ Thread t = new MyThread();
+ t.start();
+ t.interrupt();
+ System.out.println("已调用线程的interrupt方法");
+ }
+
+ static class MyThread extends Thread {
+ private static int longTimeRunningInterruptMethod(int count, int initNum) throws InterruptedException {
+ for (int i = 0; i < count; i++) {
+ TimeUnit.SECONDS.sleep(5);
+ }
+ return initNum;
+ }
+
+ public void run() {
+ int num = -1;
+ try {
+ num = longTimeRunningInterruptMethod(2, 0);
+ } catch (InterruptedException e) {
+ System.out.println("线程被中断");
+ throw new RuntimeException(e);
+ }
+ System.out.println("长时间任务运行结束,num=" + num);
+ System.out.println("线程的中断状态:" + Thread.interrupted());
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt3.java b/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt3.java
new file mode 100644
index 0000000..802c237
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/interruptExample/TestInterrupt3.java
@@ -0,0 +1,46 @@
+package com.example.chapter1.interruptExample;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * @link http://blog.csdn.net/vernonzheng/article/details/8249577
+ */
+public class TestInterrupt3 {
+ public static void main(String[] args) throws Exception {
+ Thread t = new MyThread();
+ t.start();
+// TimeUnit.SECONDS.sleep(1);//如果不能看到处理过程中被中断的情形,可以启用这句再看看效果
+ t.interrupt();
+ System.out.println("已调用线程的interrupt方法");
+ }
+
+ static class MyThread extends Thread {
+ private static int longTimeRunningNonInterruptMethod(int count, int initNum) throws InterruptedException {
+ if (interrupted()) {
+ throw new InterruptedException("正式处理前线程已经被请求中断");
+ }
+ for (int i = 0; i < count; i++) {
+ for (int j = 0; j < Integer.MAX_VALUE; j++) {
+ initNum++;
+ }
+ //假如这就是一个合适的地方
+ if (interrupted()) {
+ //回滚数据,清理操作等
+ throw new InterruptedException("线程正在处理过程中被中断");
+ }
+ }
+ return initNum;
+ }
+
+ public void run() {
+ int num;
+ try {
+ num = longTimeRunningNonInterruptMethod(2, 0);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("长时间任务运行结束,num=" + num);
+ System.out.println("线程的中断状态:" + Thread.interrupted());
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/Main.java b/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/Main.java
new file mode 100644
index 0000000..4471ef7
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/Main.java
@@ -0,0 +1,24 @@
+package com.example.chapter1.localThreadVariables;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Main {
+
+ public static void main(String[] args) {
+// UnsafeTask task = new UnsafeTask();
+ SafeTask task = new SafeTask();
+ for (int i = 0; i < 10; i++) {
+ Thread thread = new Thread(task);
+ thread.start();
+ try {
+ TimeUnit.SECONDS.sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/SafeTask.java b/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/SafeTask.java
new file mode 100644
index 0000000..72c48c9
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/SafeTask.java
@@ -0,0 +1,29 @@
+package com.example.chapter1.localThreadVariables;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class SafeTask implements Runnable {
+
+ private static ThreadLocal startDate = new ThreadLocal() {
+ protected Date initialValue() {
+ return new Date();
+ }
+ };
+
+ @Override
+ public void run() {
+ System.out.printf("Starting Thread: %s : %s\n", Thread.currentThread().getId(), startDate.get());
+ try {
+ TimeUnit.SECONDS.sleep((int) Math.rint(Math.random() * 10));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.printf("Thread Finished: %s : %s\n", Thread.currentThread().getId(), startDate.get());
+ }
+}
+
+
diff --git a/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/UnsafeTask.java b/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/UnsafeTask.java
new file mode 100644
index 0000000..6210034
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/localThreadVariables/UnsafeTask.java
@@ -0,0 +1,26 @@
+package com.example.chapter1.localThreadVariables;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/24.
+ *
+ * @link http://ifeve.com/thread-management-10/
+ */
+public class UnsafeTask implements Runnable {
+
+ private Date startDate;
+
+ @Override
+ public void run() {
+ startDate = new Date();
+ System.out.printf("Starting Thread: %s : %s\n", Thread.currentThread().getId(), startDate);
+ try {
+ TimeUnit.SECONDS.sleep((int) Math.rint(Math.random() * 10));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.printf("Thread Finished: %s : %s\n", Thread.currentThread().getId(), startDate);
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadFactory/Main.java b/Concurrency/src/main/java/com/example/chapter1/threadFactory/Main.java
new file mode 100644
index 0000000..8f5116c
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadFactory/Main.java
@@ -0,0 +1,24 @@
+package com.example.chapter1.threadFactory;
+
+/**
+ * Created by Loon on 2014/4/24.
+ *
+ * @link http://ifeve.com/thread-management-13/
+ */
+public class Main {
+ public static void main(String[] args) {
+ ThreadFactoryExample factory = new ThreadFactoryExample("ThreadFactoryExample");
+ Task task = new Task();
+
+ Thread thread;
+ System.out.printf("Starting the Threads\n");
+ for (int i = 0; i < 10; i++) {
+ thread = factory.newThread(task);
+ thread.start();
+ }
+
+ System.out.printf("Factory stats:\n");
+ System.out.printf("%s\n", factory.getStats());
+
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadFactory/Task.java b/Concurrency/src/main/java/com/example/chapter1/threadFactory/Task.java
new file mode 100644
index 0000000..d035114
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadFactory/Task.java
@@ -0,0 +1,17 @@
+package com.example.chapter1.threadFactory;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Task implements Runnable {
+ @Override
+ public void run() {
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadFactory/ThreadFactoryExample.java b/Concurrency/src/main/java/com/example/chapter1/threadFactory/ThreadFactoryExample.java
new file mode 100644
index 0000000..8f4ab94
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadFactory/ThreadFactoryExample.java
@@ -0,0 +1,43 @@
+package com.example.chapter1.threadFactory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class ThreadFactoryExample implements ThreadFactory {
+
+ private int counter;
+ private String name;
+ private List stats;
+
+ public ThreadFactoryExample(String name) {
+ counter = 0;
+ this.name = name;
+ stats = new ArrayList();
+ }
+
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r, name + "-Thread_" + counter);
+ counter++;
+ stats.add(String.format("Created thread %d with name %s on %s\n", t.getId(), t.getName(), new Date()));
+ return t;
+ }
+
+ public String getStats() {
+ StringBuffer buffer = new StringBuffer();
+ Iterator it = stats.iterator();
+
+ while (it.hasNext()) {
+ buffer.append(it.next());
+ buffer.append("\n");
+ }
+
+ return buffer.toString();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/Main.java b/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/Main.java
new file mode 100644
index 0000000..fcc9d05
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/Main.java
@@ -0,0 +1,46 @@
+package com.example.chapter1.threadGroupExample;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/24.
+ *
+ * @link http://ifeve.com/thread-management-11/
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ ThreadGroup threadGroup = new ThreadGroup("Searcher");
+ Result result = new Result();
+ SearchTask searchTask = new SearchTask(result);
+
+ for (int i = 0; i < 5; i++) {
+ Thread thread = new Thread(threadGroup, searchTask);
+ thread.start();
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ System.out.printf("Number of Threads: %d\n", threadGroup.activeCount());
+ System.out.printf("Information about the Thread Group\n");
+ threadGroup.list();
+
+ waitFinish(threadGroup);
+
+ threadGroup.interrupt();
+
+ }
+
+ private static void waitFinish(ThreadGroup threadGroup) {
+ while (threadGroup.activeCount() > 9) {
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/Result.java b/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/Result.java
new file mode 100644
index 0000000..3fd3986
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/Result.java
@@ -0,0 +1,19 @@
+package com.example.chapter1.threadGroupExample;
+
+/**
+ * Created by Loon on 2014/4/24.
+ *
+ * @link http://ifeve.com/thread-management-11/
+ */
+public class Result {
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/SearchTask.java b/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/SearchTask.java
new file mode 100644
index 0000000..d2ebcab
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadGroupExample/SearchTask.java
@@ -0,0 +1,42 @@
+package com.example.chapter1.threadGroupExample;
+
+import java.util.Date;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/24.
+ *
+ * @link http://ifeve.com/thread-management-11/
+ */
+public class SearchTask implements Runnable {
+
+ private Result result;
+
+ public SearchTask(Result result) {
+ this.result = result;
+ }
+
+ @Override
+ public void run() {
+
+ String name = Thread.currentThread().getName();
+ System.out.printf("Thread %s: Start\n", name);
+ try {
+ doTask();
+ result.setName(name);
+ } catch (InterruptedException e) {
+ System.out.printf("Thread %s: Interrupted\n", name);
+ return;
+ }
+ System.out.printf("Thread %s: End\n", name);
+
+ }
+
+ private void doTask() throws InterruptedException {
+ Random random = new Random((new Date()).getTime());
+ int value = (int) (random.nextDouble() * 100);
+ System.out.printf("Thread %s: %d\n", Thread.currentThread().getName(), value);
+ TimeUnit.SECONDS.sleep(value);
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/Main.java b/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/Main.java
new file mode 100644
index 0000000..a95b844
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/Main.java
@@ -0,0 +1,16 @@
+package com.example.chapter1.threadGroupExceptionExample;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Main {
+ public static void main(String[] args) {
+ ThreadGroupException threadGroup = new ThreadGroupException("ThreadGroupException");
+ Task task = new Task();
+ for (int i = 0; i < 2; i++) {
+ Thread t = new Thread(threadGroup, task);
+ t.start();
+ }
+
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/Task.java b/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/Task.java
new file mode 100644
index 0000000..9c8aaf6
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/Task.java
@@ -0,0 +1,22 @@
+package com.example.chapter1.threadGroupExceptionExample;
+
+import java.util.Random;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Task implements Runnable {
+ @Override
+ public void run() {
+ int result;
+ Random random = new Random(Thread.currentThread().getId());
+ while (true) {
+ result = 1000 / ((int) (random.nextDouble() * 1000));
+ System.out.printf("%s : f %s \n", Thread.currentThread().getId(), result);
+ if (Thread.currentThread().isInterrupted()) {
+ System.out.printf("%d : Interrupted\n", Thread.currentThread().getId());
+ return;
+ }
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/ThreadGroupException.java b/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/ThreadGroupException.java
new file mode 100644
index 0000000..005041c
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter1/threadGroupExceptionExample/ThreadGroupException.java
@@ -0,0 +1,19 @@
+package com.example.chapter1.threadGroupExceptionExample;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class ThreadGroupException extends ThreadGroup {
+
+ public ThreadGroupException(String name) {
+ super(name);
+ }
+
+ @Override
+ public void uncaughtException(Thread t, Throwable e) {
+ System.out.printf("The thread %s has thrown an Exception\n", t.getId());
+ e.printStackTrace(System.out);
+ System.out.printf("Terminating the rest of the Threads\n");
+ interrupt();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/lock/Job.java b/Concurrency/src/main/java/com/example/chapter2/lock/Job.java
new file mode 100644
index 0000000..ba48365
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/lock/Job.java
@@ -0,0 +1,21 @@
+package com.example.chapter2.lock;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Job implements Runnable {
+
+ private PrintQueue printQueue;
+
+ public Job(PrintQueue printQueue) {
+ this.printQueue = printQueue;
+ }
+
+ @Override
+ public void run() {
+ System.out.printf("%s: Going to print a document\n", Thread.currentThread().getName());
+ printQueue.printJob(new Object());
+ System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName());
+
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/lock/Main.java b/Concurrency/src/main/java/com/example/chapter2/lock/Main.java
new file mode 100644
index 0000000..79b7a87
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/lock/Main.java
@@ -0,0 +1,19 @@
+package com.example.chapter2.lock;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Main {
+ public static void main(String[] args) {
+ PrintQueue printQueue = new PrintQueue();
+
+ Thread thread[] = new Thread[10];
+ for (int i = 0; i < 10; i++) {
+ thread[i] = new Thread(new Job(printQueue), "Thread " + i);
+ }
+
+ for (int i = 0; i < 10; i++) {
+ thread[i].start();
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/lock/PrintQueue.java b/Concurrency/src/main/java/com/example/chapter2/lock/PrintQueue.java
new file mode 100644
index 0000000..8ee88ce
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/lock/PrintQueue.java
@@ -0,0 +1,27 @@
+package com.example.chapter2.lock;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class PrintQueue {
+ private final Lock queueLock = new ReentrantLock();
+
+ public void printJob(Object document) {
+
+ queueLock.lock();
+
+ try {
+ Long duration = (long) (Math.random() * 10000);
+ System.out.println(Thread.currentThread().getName() + ": PrintQueue: Printing a Job during " + (duration / 1000) + " seconds");
+ TimeUnit.MILLISECONDS.sleep(duration);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ queueLock.unlock();
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Main.java b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Main.java
new file mode 100644
index 0000000..862c391
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Main.java
@@ -0,0 +1,27 @@
+package com.example.chapter2.readWriteLock;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Main {
+ public static void main(String[] args) {
+
+ PricesInfo pricesInfo = new PricesInfo();
+
+ Reader readers[] = new Reader[5];
+ Thread threadsReader[] = new Thread[5];
+
+ for (int i = 0; i < 5; i++) {
+ readers[i] = new Reader(pricesInfo);
+ threadsReader[i] = new Thread(readers[i]);
+ }
+
+ Writer writer = new Writer(pricesInfo);
+ Thread threadWriter = new Thread(writer);
+
+ for (int i = 0; i < 5; i++) {
+ threadsReader[i].start();
+ }
+ threadWriter.start();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/readWriteLock/PricesInfo.java b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/PricesInfo.java
new file mode 100644
index 0000000..2f3e600
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/PricesInfo.java
@@ -0,0 +1,47 @@
+package com.example.chapter2.readWriteLock;
+
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class PricesInfo {
+ private double price1;
+ private double price2;
+ private ReadWriteLock lock;
+
+ public PricesInfo() {
+ price1 = 1.0;
+ price2 = 2.0;
+ lock = new ReentrantReadWriteLock();
+ }
+
+ public double getPrice1() {
+ lock.readLock().lock();
+ double value = price1;
+ lock.readLock().unlock();
+ return value;
+ }
+
+
+ public double getPrice2() {
+ lock.readLock().lock();
+ double value = price2;
+ lock.readLock().unlock();
+ return value;
+ }
+
+ public void setPrices(double price1, double price2) {
+
+ lock.writeLock().lock();
+// System.out.printf("Writer: Attempt to modify the prices.\n");
+ this.price1 = price1;
+ this.price2 = price2;
+// System.out.printf("Writer: Prices have been modified.\n");
+ lock.writeLock().unlock();
+
+ }
+
+
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Reader.java b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Reader.java
new file mode 100644
index 0000000..f5d0d4f
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Reader.java
@@ -0,0 +1,21 @@
+package com.example.chapter2.readWriteLock;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Reader implements Runnable {
+
+ private PricesInfo pricesInfo;
+
+ public Reader(PricesInfo pricesInfo) {
+ this.pricesInfo = pricesInfo;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 10; i++) {
+ System.out.printf("%s: Price 1: %f\n", Thread.currentThread().getName(), pricesInfo.getPrice1());
+ System.out.printf("%s: Price 2: %f\n", Thread.currentThread().getName(), pricesInfo.getPrice2());
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Writer.java b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Writer.java
new file mode 100644
index 0000000..345f47b
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/readWriteLock/Writer.java
@@ -0,0 +1,29 @@
+package com.example.chapter2.readWriteLock;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Writer implements Runnable {
+
+ private PricesInfo pricesInfo;
+
+ public Writer(PricesInfo pricesInfo) {
+ this.pricesInfo = pricesInfo;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 3; i++) {
+ System.out.printf("Writer: Attempt to modify the prices.\n");
+ pricesInfo.setPrices(Math.random() * 10, Math.random() * 8);
+ System.out.printf("Writer: Prices have been modified.\n");
+ try {
+ TimeUnit.MILLISECONDS.sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section3/Cinema.java b/Concurrency/src/main/java/com/example/chapter2/section3/Cinema.java
new file mode 100644
index 0000000..bc2da03
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section3/Cinema.java
@@ -0,0 +1,61 @@
+package com.example.chapter2.section3;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Cinema {
+ private final Object controlCinema1, controlCinema2;
+ private long vacanciesCinema1;
+ private long vacanciesCinema2;
+
+ public Cinema() {
+ this.vacanciesCinema1 = 20;
+ this.vacanciesCinema2 = 20;
+ this.controlCinema1 = new Object();
+ this.controlCinema2 = new Object();
+ }
+
+ public boolean sellTickets1(int number) {
+// synchronized (controlCinema1) {
+ if (number < vacanciesCinema1) {
+ vacanciesCinema1 -= number;
+ return true;
+ } else {
+ return false;
+ }
+// }
+ }
+
+ public boolean sellTickets2(int number) {
+// synchronized (controlCinema2) {
+ if (number < vacanciesCinema2) {
+ vacanciesCinema2 -= number;
+ return true;
+ } else {
+ return false;
+ }
+// }
+ }
+
+ public boolean returnTickets1(int number) {
+// synchronized (controlCinema1) {
+ vacanciesCinema1 += number;
+ return true;
+// }
+ }
+
+ public boolean returnTickets2(int number) {
+// synchronized (controlCinema2) {
+ vacanciesCinema2 += number;
+ return true;
+// }
+ }
+
+ public long getVacanciesCinema1() {
+ return vacanciesCinema1;
+ }
+
+ public long getVacanciesCinema2() {
+ return vacanciesCinema2;
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section3/Main.java b/Concurrency/src/main/java/com/example/chapter2/section3/Main.java
new file mode 100644
index 0000000..d674305
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section3/Main.java
@@ -0,0 +1,31 @@
+package com.example.chapter2.section3;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Main {
+
+
+ public static void main(String[] args) {
+ Cinema cinema = new Cinema();
+ TicketOffice1 ticketOffice1 = new TicketOffice1(cinema);
+ Thread thread1 = new Thread(ticketOffice1, "TicketOffice1");
+
+ TicketOffice2 ticketOffice2 = new TicketOffice2(cinema);
+ Thread thread2 = new Thread(ticketOffice2, "TicketOffice2");
+
+ thread1.start();
+ thread2.start();
+
+ // todo: 此处实现的同步的方法为join方法 ,非synchronized关键字?
+ try {
+ thread1.join();
+ thread2.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ System.out.printf("Room 1 Vacancies: %d\n", cinema.getVacanciesCinema1());
+ System.out.printf("Room 2 Vacancies: %d\n", cinema.getVacanciesCinema2());
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section3/TicketOffice1.java b/Concurrency/src/main/java/com/example/chapter2/section3/TicketOffice1.java
new file mode 100644
index 0000000..835a3d6
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section3/TicketOffice1.java
@@ -0,0 +1,25 @@
+package com.example.chapter2.section3;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class TicketOffice1 implements Runnable {
+
+ private Cinema cinema;
+
+ public TicketOffice1(Cinema cinema) {
+ this.cinema = cinema;
+ }
+
+ @Override
+ public void run() {
+ cinema.sellTickets1(3);
+ cinema.sellTickets1(2);
+ cinema.sellTickets2(2);
+ cinema.returnTickets1(3);
+ cinema.sellTickets1(5);
+ cinema.sellTickets2(2);
+ cinema.sellTickets2(2);
+ cinema.sellTickets2(2);
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section3/TicketOffice2.java b/Concurrency/src/main/java/com/example/chapter2/section3/TicketOffice2.java
new file mode 100644
index 0000000..a573715
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section3/TicketOffice2.java
@@ -0,0 +1,24 @@
+package com.example.chapter2.section3;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class TicketOffice2 implements Runnable {
+ private Cinema cinema;
+
+ public TicketOffice2(Cinema cinema) {
+ this.cinema = cinema;
+ }
+
+ @Override
+ public void run() {
+ cinema.sellTickets2(2);
+ cinema.sellTickets2(4);
+ cinema.sellTickets1(2);
+ cinema.sellTickets1(1);
+ cinema.returnTickets2(2);
+ cinema.sellTickets1(3);
+ cinema.sellTickets2(2);
+ cinema.sellTickets1(2);
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section4/Consumer.java b/Concurrency/src/main/java/com/example/chapter2/section4/Consumer.java
new file mode 100644
index 0000000..104532d
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section4/Consumer.java
@@ -0,0 +1,20 @@
+package com.example.chapter2.section4;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Consumer implements Runnable {
+
+ private EventStorage storage;
+
+ public Consumer(EventStorage storage) {
+ this.storage = storage;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 100; i++) {
+ storage.get();
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section4/EventStorage.java b/Concurrency/src/main/java/com/example/chapter2/section4/EventStorage.java
new file mode 100644
index 0000000..041dabe
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section4/EventStorage.java
@@ -0,0 +1,43 @@
+package com.example.chapter2.section4;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class EventStorage {
+ private int maxSize;
+ private List storage;
+
+ public EventStorage() {
+ this.maxSize = 10;
+ this.storage = new LinkedList<>();
+ }
+
+ public synchronized void set() {
+ while (storage.size() == maxSize) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ ((LinkedList) storage).offer(new Date()); // offer方法有误
+ System.out.printf("Set: %d\n", storage.size());
+ notifyAll();
+ }
+
+ public synchronized void get() {
+ while (storage.size() == 0) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.printf("Get: %d: %s\n", storage.size(), ((LinkedList>) storage).poll());
+ notifyAll();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section4/Main.java b/Concurrency/src/main/java/com/example/chapter2/section4/Main.java
new file mode 100644
index 0000000..db9c432
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section4/Main.java
@@ -0,0 +1,21 @@
+package com.example.chapter2.section4;
+
+/**
+ * Created by Loon on 2014/4/27.
+ * 基于synchronized关键字和wait()和notify(),notifyAll()方法实现生产者消费者问题
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ EventStorage storage = new EventStorage();
+
+ Producer producer = new Producer(storage);
+ Thread thread1 = new Thread(producer);
+
+ Consumer consumer = new Consumer(storage);
+ Thread thread2 = new Thread(consumer);
+
+ thread2.start();
+ thread1.start();
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section4/Producer.java b/Concurrency/src/main/java/com/example/chapter2/section4/Producer.java
new file mode 100644
index 0000000..d332f59
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section4/Producer.java
@@ -0,0 +1,20 @@
+package com.example.chapter2.section4;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class Producer implements Runnable {
+
+ private EventStorage storage;
+
+ public Producer(EventStorage storage) {
+ this.storage = storage;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 100; i++) {
+ storage.set();
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section5/Job.java b/Concurrency/src/main/java/com/example/chapter2/section5/Job.java
new file mode 100644
index 0000000..15faddc
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section5/Job.java
@@ -0,0 +1,21 @@
+package com.example.chapter2.section5;
+
+/**
+ * Created by Loon on 2014/6/16.
+ */
+public class Job implements Runnable {
+
+ private PrintQueue printQueue;
+
+ public Job(PrintQueue printQueue) {
+ this.printQueue = printQueue;
+ }
+
+ @Override
+ public void run() {
+
+ System.out.printf("%s: Going to print a document\n", Thread.currentThread().getName());
+ printQueue.printJob(new Object());
+ System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName());
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section5/Main.java b/Concurrency/src/main/java/com/example/chapter2/section5/Main.java
new file mode 100644
index 0000000..280ccb5
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section5/Main.java
@@ -0,0 +1,19 @@
+package com.example.chapter2.section5;
+
+/**
+ * Created by Loon on 2014/6/16.
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ PrintQueue printQueue = new PrintQueue();
+ Thread thread[] = new Thread[10];
+ for (int i = 0; i < 10; i++) {
+ thread[i] = new Thread(new Job(printQueue), "Thread " + i);
+ }
+ for (int i = 0; i < 10; i++) {
+ thread[i].start();
+ }
+
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/section5/PrintQueue.java b/Concurrency/src/main/java/com/example/chapter2/section5/PrintQueue.java
new file mode 100644
index 0000000..d69a61f
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/section5/PrintQueue.java
@@ -0,0 +1,29 @@
+package com.example.chapter2.section5;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by Loon on 2014/6/16.
+ */
+public class PrintQueue {
+
+ private final Lock queueLock = new ReentrantLock(); // 可重入锁
+
+ public void printJob(Object document) {
+ queueLock.lock();
+
+ try {
+ Long duration = (long) (Math.random() * 10000);
+ System.out.println(Thread.currentThread().getName() + ": PrintQueue:Printing a Job during "
+ + (duration / 1000) + " seconds");
+ Thread.sleep(duration);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ queueLock.unlock();
+ }
+
+ }
+
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Account.java b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Account.java
new file mode 100644
index 0000000..04c55f9
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Account.java
@@ -0,0 +1,37 @@
+package com.example.chapter2.synchroinzation;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Account {
+
+ private double balance;
+
+ public synchronized void addAmount(double amount) {
+
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ balance += amount;
+ }
+
+ public synchronized void subtractAmount(double amount) {
+
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ balance -= amount;
+ }
+
+ public double getBalance() {
+ return balance;
+ }
+
+ public void setBalance(double balance) {
+ this.balance = balance;
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Bank.java b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Bank.java
new file mode 100644
index 0000000..b525158
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Bank.java
@@ -0,0 +1,20 @@
+package com.example.chapter2.synchroinzation;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Bank implements Runnable {
+
+ private Account account;
+
+ public Bank(Account account) {
+ this.account = account;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 100; i++) {
+ account.subtractAmount(1000);
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Company.java b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Company.java
new file mode 100644
index 0000000..500bc18
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Company.java
@@ -0,0 +1,20 @@
+package com.example.chapter2.synchroinzation;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Company implements Runnable {
+
+ private Account account;
+
+ public Company(Account account) {
+ this.account = account;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 100; i++) {
+ account.addAmount(1000);
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Main.java b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Main.java
new file mode 100644
index 0000000..400e8d6
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter2/synchroinzation/Main.java
@@ -0,0 +1,31 @@
+package com.example.chapter2.synchroinzation;
+
+/**
+ * Created by Loon on 2014/4/24.
+ */
+public class Main {
+ public static void main(String[] args) {
+ Account account = new Account();
+ account.setBalance(1000);
+
+ Company company = new Company(account);
+ Thread companyThread = new Thread(company);
+
+ Bank bank = new Bank(account);
+ Thread bankThread = new Thread(bank);
+
+ System.out.printf("Account : Initial Balance: %f\n", account.getBalance());
+
+ companyThread.start();
+ bankThread.start();
+
+ // 此处为什么要阻塞线程?
+ try {
+ companyThread.join();
+ bankThread.join();
+ System.out.printf("Account : Final Balance: %f\n", account.getBalance());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/chapter3/section2/Job.java b/Concurrency/src/main/java/com/example/chapter3/section2/Job.java
new file mode 100644
index 0000000..70e9f94
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter3/section2/Job.java
@@ -0,0 +1,30 @@
+package com.example.chapter3.section2;
+
+/**
+ * Created by Loon on 2014/6/16.
+ */
+//8. 创建一个名为Job的类并一定实现Runnable 接口。这个类实现把文档传送到打印机的任务。
+public class Job implements Runnable {
+
+ //9. 声明一个对象为PrintQueue,名为printQueue。
+ private PrintQueue printQueue;
+
+ //10. 实现类的构造函数,初始化这个类里的PrintQueue对象。
+ public Job(PrintQueue printQueue) {
+ this.printQueue = printQueue;
+ }
+
+ //11. 实现方法run()。
+ @Override
+ public void run() {
+
+//12. 首先, 此方法写信息到操控台表明任务已经开始执行了。
+ System.out.printf("%s: Going to print a job\n", Thread.currentThread().getName());
+
+//13. 然后,调用PrintQueue 对象的printJob()方法。
+ printQueue.printJob(new Object());
+
+//14. 最后, 此方法写信息到操控台表明它已经结束运行了。
+ System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName());
+ }
+}
\ No newline at end of file
diff --git a/Concurrency/src/main/java/com/example/chapter3/section2/Main.java b/Concurrency/src/main/java/com/example/chapter3/section2/Main.java
new file mode 100644
index 0000000..da989f3
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter3/section2/Main.java
@@ -0,0 +1,25 @@
+package com.example.chapter3.section2;
+
+/**
+ * Created by Loon on 2014/6/16.
+ */
+
+//15. 实现例子的main类,创建名为 Main的类并实现main()方法。
+public class Main {
+ public static void main(String args[]) {
+
+//16. 创建PrintQueue对象名为printQueue。
+ PrintQueue printQueue = new PrintQueue();
+
+//17. 创建10个threads。每个线程会执行一个发送文档到print queue的Job对象。
+ Thread thread[] = new Thread[10];
+ for (int i = 0; i < 10; i++) {
+ thread[i] = new Thread(new Job(printQueue), "Thread" + i);
+ }
+
+//18. 最后,开始这10个线程们。
+ for (int i = 0; i < 10; i++) {
+ thread[i].start();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Concurrency/src/main/java/com/example/chapter3/section2/PrintQueue.java b/Concurrency/src/main/java/com/example/chapter3/section2/PrintQueue.java
new file mode 100644
index 0000000..336bd3f
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/chapter3/section2/PrintQueue.java
@@ -0,0 +1,41 @@
+package com.example.chapter3.section2;
+
+import java.util.concurrent.Semaphore;
+
+/**
+ * Created by Loon on 2014/6/16.
+ */
+//1. 创建一个会实现print queue的类名为 PrintQueue。
+public class PrintQueue {
+
+ //2. 声明一个对象为Semaphore,称它为semaphore。
+ private final Semaphore semaphore;
+
+ //3. 实现类的构造函数并初始能保护print quere的访问的semaphore对象的值。
+ public PrintQueue() {
+ semaphore = new Semaphore(1);
+ }
+
+ //4. 实现Implement the printJob()方法,此方法可以模拟打印文档,并接收document对象作为参数。
+ public void printJob(Object document) {
+
+ //5. 在这方法内,首先,你必须调用acquire()方法获得demaphore。这个方法会抛出 InterruptedException异常,使用必须包含处理这个异常的代码。
+ try {
+ semaphore.acquire();
+
+ //6. 然后,实现能随机等待一段时间的模拟打印文档的行。
+ long duration = (long) (Math.random() * 10);
+ System.out.printf("%s: PrintQueue: Printing a Job during %d seconds\n", Thread.currentThread().getName(), duration);
+ Thread.sleep(duration);
+
+ //7. 最后,释放semaphore通过调用semaphore的relaser()方法。
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ semaphore.release();
+ }
+
+ }
+}
+
+
diff --git a/Concurrency/src/main/java/com/example/section5/forkJoinPool/Main.java b/Concurrency/src/main/java/com/example/section5/forkJoinPool/Main.java
new file mode 100644
index 0000000..7970706
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/section5/forkJoinPool/Main.java
@@ -0,0 +1,51 @@
+package com.example.section5.forkJoinPool;
+
+import java.util.List;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Loon on 2014/4/25.
+ */
+public class Main {
+
+ public static void main(String[] args) {
+ ProductListGenerator generator = new ProductListGenerator();
+ List products = generator.generate(1000000);
+ long startTime = System.currentTimeMillis(); //获取开始时间
+
+
+ Task task = new Task(products, 0, products.size(), 0.20);
+ ForkJoinPool pool = new ForkJoinPool();
+ pool.execute(task);
+
+ do {
+ System.out.printf("Main: Thread Count: %d\n", pool.getActiveThreadCount());
+ System.out.printf("Main: Thread Steal: %d\n", pool.getStealCount());
+ System.out.printf("Main: Parallelism: %d\n", pool.getParallelism());
+ try {
+ TimeUnit.MILLISECONDS.sleep(5);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } while (!task.isDone());
+
+
+ pool.shutdown();
+
+ if (task.isCompletedNormally()) {
+ System.out.printf("Main: The process has completed normally.\n");
+ }
+
+ for (Product product : products) {
+ if (product.getPrice() != 12) {
+ System.out.printf("Product %s: %f\n", product.getName(), product.getPrice());
+ }
+ }
+
+ System.out.println("Main: End of the program.\n");
+ long endTime = System.currentTimeMillis(); //获取结束时间
+
+ System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/section5/forkJoinPool/Product.java b/Concurrency/src/main/java/com/example/section5/forkJoinPool/Product.java
new file mode 100644
index 0000000..7bdb8a9
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/section5/forkJoinPool/Product.java
@@ -0,0 +1,26 @@
+package com.example.section5.forkJoinPool;
+
+/**
+ * Created by Loon on 2014/4/25.
+ */
+public class Product {
+
+ private String name;
+ private double price;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/section5/forkJoinPool/ProductListGenerator.java b/Concurrency/src/main/java/com/example/section5/forkJoinPool/ProductListGenerator.java
new file mode 100644
index 0000000..cb379b4
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/section5/forkJoinPool/ProductListGenerator.java
@@ -0,0 +1,24 @@
+package com.example.section5.forkJoinPool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Loon on 2014/4/25.
+ */
+public class ProductListGenerator {
+
+ public List generate(int size) {
+
+ List ret = new ArrayList();
+
+ for (int i = 0; i < size; i++) {
+ Product product = new Product();
+ product.setName("Product" + i);
+ product.setPrice(10);
+ ret.add(product);
+ }
+ return ret;
+ }
+
+}
diff --git a/Concurrency/src/main/java/com/example/section5/forkJoinPool/Task.java b/Concurrency/src/main/java/com/example/section5/forkJoinPool/Task.java
new file mode 100644
index 0000000..c88ea6d
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/section5/forkJoinPool/Task.java
@@ -0,0 +1,44 @@
+package com.example.section5.forkJoinPool;
+
+import java.util.List;
+import java.util.concurrent.RecursiveAction;
+
+/**
+ * Created by Loon on 2014/4/25.
+ */
+public class Task extends RecursiveAction {
+
+ private static final long serialVersionUID = 1L;
+
+ private List products;
+ private int first;
+ private int last;
+ private double increment;
+
+ public Task(List products, int first, int last, double increment) {
+ this.products = products;
+ this.first = first;
+ this.last = last;
+ this.increment = increment;
+ }
+
+ @Override
+ protected void compute() {
+ if (last - first < 100) {
+ updatePrices();
+ } else {
+ int middle = (last + first) / 2;
+ System.out.printf("Task: Pending tasks: %s\n", getQueuedTaskCount());
+ Task t1 = new Task(products, first, middle + 1, increment);
+ Task t2 = new Task(products, middle + 1, last, increment);
+ invokeAll(t1, t2);
+ }
+ }
+
+ private void updatePrices() {
+ for (int i = first; i < last; i++) {
+ Product product = products.get(i);
+ product.setPrice(product.getPrice() * (1 + increment));
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/thread/JoinExample.java b/Concurrency/src/main/java/com/example/thread/JoinExample.java
new file mode 100644
index 0000000..455b2cd
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/thread/JoinExample.java
@@ -0,0 +1,31 @@
+package com.example.thread;
+
+/**
+ * Created by Loon on 2014/4/27.
+ */
+public class JoinExample implements Runnable {
+
+ private static int sum = 0;
+
+ public static void main(String[] args) {
+
+
+ Thread thread = new Thread(new JoinExample());
+ thread.start();
+ try {
+ thread.join(); // 先执行子线程,再执行主线程MAIN方法。
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println(sum);
+
+ }
+
+ @Override
+ public void run() {
+
+ for (int i = 0; i < 5; i++) {
+ sum++;
+ }
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/timeout/QueryData.java b/Concurrency/src/main/java/com/example/timeout/QueryData.java
new file mode 100644
index 0000000..98c0f48
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/timeout/QueryData.java
@@ -0,0 +1,9 @@
+package com.example.timeout;
+
+/**
+ * Created by loon on 17/2/9.
+ */
+public interface QueryData {
+
+ String getData();
+}
diff --git a/Concurrency/src/main/java/com/example/timeout/QueryDataOneImpl.java b/Concurrency/src/main/java/com/example/timeout/QueryDataOneImpl.java
new file mode 100644
index 0000000..651b225
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/timeout/QueryDataOneImpl.java
@@ -0,0 +1,21 @@
+package com.example.timeout;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by loon on 17/2/9.
+ */
+public class QueryDataOneImpl implements QueryData {
+
+
+ public String getData() {
+
+ try {
+ TimeUnit.SECONDS.sleep(5);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ return "1111";
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/timeout/QueryDataSecondImpl.java b/Concurrency/src/main/java/com/example/timeout/QueryDataSecondImpl.java
new file mode 100644
index 0000000..bcb3b58
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/timeout/QueryDataSecondImpl.java
@@ -0,0 +1,11 @@
+package com.example.timeout;
+
+/**
+ * Created by loon on 17/2/9.
+ */
+public class QueryDataSecondImpl implements QueryData {
+
+ public String getData() {
+ return "2222";
+ }
+}
diff --git a/Concurrency/src/main/java/com/example/timeout/TimeOutTest.java b/Concurrency/src/main/java/com/example/timeout/TimeOutTest.java
new file mode 100644
index 0000000..d69f520
--- /dev/null
+++ b/Concurrency/src/main/java/com/example/timeout/TimeOutTest.java
@@ -0,0 +1,58 @@
+package com.example.timeout;
+
+import com.google.common.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+/**
+ * Created by loon on 17/2/9.
+ */
+public class TimeOutTest {
+
+
+ public static void main(String[] args) {
+
+
+ List stringList = new ArrayList();
+
+
+ ExecutorService exec = Executors.newFixedThreadPool(2);
+
+ List queryDataList = Lists.newArrayList(new QueryDataOneImpl(), new QueryDataSecondImpl());
+ List> futureList = Lists.newArrayList();
+
+ for (final QueryData queryData : queryDataList) {
+
+ futureList.add(exec.submit(new Callable() {
+ public String call() throws Exception {
+ return queryData.getData();
+ }
+ })
+ );
+
+ }
+
+
+ for (Future stringFuture : futureList) {
+
+ try {
+ stringList.add(stringFuture.get(3, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ } catch (TimeoutException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ System.out.println(stringList);
+
+ }
+}
+
+
diff --git a/Concurrency/src/main/java/package-info.java b/Concurrency/src/main/java/package-info.java
new file mode 100644
index 0000000..9c32670
--- /dev/null
+++ b/Concurrency/src/main/java/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Created by Loon on 2014/4/22.
+ * http://ifeve.com/java-7-concurrency-cookbook/
+ */
diff --git a/Concurrency/src/main/resources/nio-data.txt b/Concurrency/src/main/resources/nio-data.txt
new file mode 100644
index 0000000..e69de29
diff --git a/Crawler/pom.xml b/Crawler/pom.xml
new file mode 100644
index 0000000..a54c465
--- /dev/null
+++ b/Crawler/pom.xml
@@ -0,0 +1,49 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Crawler
+
+
+
+
+ org.apache.nutch
+ nutch
+ 2.2.1
+
+
+
+
+
+
+
+
+
+
+
+
+ edu.uci.ics
+ crawler4j
+ 4.0
+
+
+ org.jsoup
+ jsoup
+ 1.8.1
+
+
+ com.google.inject
+ guice
+ 4.0-beta5
+ no_aop
+
+
+
+
\ No newline at end of file
diff --git a/Crawler/src/main/java/com/example/cache/AbstractLoadCache.java b/Crawler/src/main/java/com/example/cache/AbstractLoadCache.java
new file mode 100644
index 0000000..01f87e7
--- /dev/null
+++ b/Crawler/src/main/java/com/example/cache/AbstractLoadCache.java
@@ -0,0 +1,35 @@
+package com.example.cache;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by GuoLong on 14-7-8.
+ */
+public abstract class AbstractLoadCache {
+
+ /**
+ *
+ */
+ public LoadingCache cache = CacheBuilder.newBuilder()
+ .refreshAfterWrite(30, TimeUnit.DAYS)
+ .maximumSize(500)
+ .build(new CacheLoader() {
+ @Override
+ public V load(K key) throws Exception {
+ return getData(key);
+ }
+
+ });
+
+ public abstract V getData(K key) throws IOException;
+
+ public LoadingCache getCache() {
+ return cache;
+ }
+
+}
diff --git a/Crawler/src/main/java/com/example/cache/gewara/CinemaCache.java b/Crawler/src/main/java/com/example/cache/gewara/CinemaCache.java
new file mode 100644
index 0000000..f262128
--- /dev/null
+++ b/Crawler/src/main/java/com/example/cache/gewara/CinemaCache.java
@@ -0,0 +1,33 @@
+package com.example.cache.gewara;
+
+import com.example.cache.AbstractLoadCache;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class CinemaCache extends AbstractLoadCache {
+
+ @Override
+ public String getData(String key) throws IOException {
+
+ String cinemaId = "";
+
+ Document doc = Jsoup.connect("http://www.gewara.com/movie/searchCinema.xhtml?countycode=310115").userAgent("Mozilla").get();
+ Elements links = doc.select("a[href^=/cinema][target=_blank][class=color3]");
+
+ for (Element link : links) {
+
+ if (link.text().equals(key)) {
+ cinemaId = link.attr("href").substring(8);
+ }
+ this.getCache().put(link.text(), link.attr("href").substring(8));
+ }
+ return cinemaId;
+ }
+}
diff --git a/Crawler/src/main/java/com/example/cache/gewara/MovieCache.java b/Crawler/src/main/java/com/example/cache/gewara/MovieCache.java
new file mode 100644
index 0000000..9c41c60
--- /dev/null
+++ b/Crawler/src/main/java/com/example/cache/gewara/MovieCache.java
@@ -0,0 +1,33 @@
+package com.example.cache.gewara;
+
+import com.example.cache.AbstractLoadCache;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class MovieCache extends AbstractLoadCache {
+
+ @Override
+ public String getData(String key) throws IOException {
+
+ String movieId = "";
+
+ Document doc = Jsoup.connect("http://www.gewara.com/movie/searchMovie.xhtml").userAgent("Mozilla").get();
+ Elements links = doc.select("a[href^=/movie][target=_blank][class=color3]");
+
+ for (Element link : links) {
+ if (link.text().equals(key)) {
+ movieId = link.attr("href").substring(7);
+ }
+ this.getCache().put(link.text(), link.attr("href").substring(7));
+ }
+ return movieId;
+ }
+
+}
diff --git a/Crawler/src/main/java/com/example/service/MovieService.java b/Crawler/src/main/java/com/example/service/MovieService.java
new file mode 100644
index 0000000..5f008ba
--- /dev/null
+++ b/Crawler/src/main/java/com/example/service/MovieService.java
@@ -0,0 +1,20 @@
+package com.example.service;
+
+import com.example.test.jsoup.Movie;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public interface MovieService {
+
+ List getMovieList();
+
+ List getMovieList(String startTime, String movieName);
+
+ List getMovieList(String movieName) throws IOException, ExecutionException;
+
+}
diff --git a/Crawler/src/main/java/com/example/service/impl/GewaraMovieServiceImpl.java b/Crawler/src/main/java/com/example/service/impl/GewaraMovieServiceImpl.java
new file mode 100644
index 0000000..31aa929
--- /dev/null
+++ b/Crawler/src/main/java/com/example/service/impl/GewaraMovieServiceImpl.java
@@ -0,0 +1,82 @@
+package com.example.service.impl;
+
+import com.example.cache.gewara.CinemaCache;
+import com.example.cache.gewara.MovieCache;
+import com.example.service.MovieService;
+import com.example.test.jsoup.Movie;
+import com.google.common.collect.Lists;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class GewaraMovieServiceImpl implements MovieService {
+
+
+ @Inject
+ private MovieCache movieCache;
+ @Inject
+ private CinemaCache cinemaCache;
+
+ public GewaraMovieServiceImpl() {
+ Guice.createInjector().injectMembers(this);
+ }
+
+ @Override
+ public List getMovieList() {
+
+ return null;
+ }
+
+ @Override
+ public List getMovieList(String startTime, String movieName) {
+
+
+ return null;
+ }
+
+ @Override
+ public List getMovieList(String movieName) throws IOException, ExecutionException {
+
+ List cinemaIds = Lists.newArrayList("", "", "");
+
+ String movieId = this.movieCache.getCache().getUnchecked(movieName);
+// String cinemaId = this.cinemaCache.getCache().getAll();
+
+ Document doc = Jsoup.connect("http://www.gewara.com/movie/ajax/getOpiItem.xhtml?movieid=" + movieId + "&fyrq=2015-01-15&cid=1").userAgent("Mozilla").get();
+
+ Element element = doc.select("div.chooseOpi_body").first();
+ Elements lis = element.select("li");
+
+ for (Element li : lis) {
+
+ Movie movie = new Movie();
+ movie.setStartTime(li.select("span.opitime").first().child(0).text());
+ movie.setPrice(li.select("span.opiPrice").first().child(0).text());
+// if (li.select("span.opiSales").first() != null){
+// movie.setSale(li.select("span.opiSales").first().tagName("b").child(1).text() +li.select("span.opiSales").first().tagName("b").child(1).text());
+// }
+ System.out.println(movie.toString());
+ }
+
+
+ return null;
+ }
+
+ public void setMovieCache(MovieCache movieCache) {
+ this.movieCache = movieCache;
+ }
+
+ public void setCinemaCache(CinemaCache cinemaCache) {
+ this.cinemaCache = cinemaCache;
+ }
+}
diff --git a/Crawler/src/main/java/com/example/service/package-info.java b/Crawler/src/main/java/com/example/service/package-info.java
new file mode 100644
index 0000000..81f2cf4
--- /dev/null
+++ b/Crawler/src/main/java/com/example/service/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Created by Loon on 2015/1/9.
+ */
+package com.example.service;
\ No newline at end of file
diff --git a/Crawler/src/main/java/com/example/test/crawler4j/FirstCrawler.java b/Crawler/src/main/java/com/example/test/crawler4j/FirstCrawler.java
new file mode 100644
index 0000000..e36da23
--- /dev/null
+++ b/Crawler/src/main/java/com/example/test/crawler4j/FirstCrawler.java
@@ -0,0 +1,54 @@
+package com.example.test.crawler4j;
+
+import edu.uci.ics.crawler4j.crawler.Page;
+import edu.uci.ics.crawler4j.crawler.WebCrawler;
+import edu.uci.ics.crawler4j.parser.HtmlParseData;
+import edu.uci.ics.crawler4j.url.WebURL;
+
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class FirstCrawler extends WebCrawler {
+
+ private final static Pattern BINARY_FILES_EXTENSIONS =
+ Pattern.compile(".*\\.(bmp|gif|jpe?g|png|tiff?|pdf|ico|xaml|pict|rif|pptx?|ps" +
+ "|mid|mp2|mp3|mp4|wav|wma|au|aiff|flac|ogg|3gp|aac|amr|au|vox" +
+ "|avi|mov|mpe?g|ra?m|m4v|smil|wm?v|swf|aaf|asf|flv|mkv" +
+ "|zip|rar|gz|7z|aac|ace|alz|apk|arc|arj|dmg|jar|lzip|lha)" +
+ "(\\?.*)?$"); // For url Query parts ( URL?q=... )
+
+ /**
+ * You should implement this function to specify whether the given url
+ * should be crawled or not (based on your crawling logic).
+ */
+ @Override
+ public boolean shouldVisit(Page page, WebURL url) {
+ String href = url.getURL().toLowerCase();
+
+ return !BINARY_FILES_EXTENSIONS.matcher(href).matches() && href.startsWith("http://www.gewara.com/movie/208315566");
+ }
+
+ /**
+ * This function is called when a page is fetched and ready
+ * to be processed by your program.
+ */
+ @Override
+ public void visit(Page page) {
+ String url = page.getWebURL().getURL();
+ System.out.println("URL: " + url);
+
+ if (page.getParseData() instanceof HtmlParseData) {
+ HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
+ String text = htmlParseData.getText();
+ String html = htmlParseData.getHtml();
+ Set links = htmlParseData.getOutgoingUrls();
+
+ System.out.println("Text length: " + text.length());
+ System.out.println("Html length: " + html.length());
+ System.out.println("Number of outgoing links: " + links.size());
+ }
+ }
+}
diff --git a/Crawler/src/main/java/com/example/test/crawler4j/FirstCrawlerController.java b/Crawler/src/main/java/com/example/test/crawler4j/FirstCrawlerController.java
new file mode 100644
index 0000000..efa0e58
--- /dev/null
+++ b/Crawler/src/main/java/com/example/test/crawler4j/FirstCrawlerController.java
@@ -0,0 +1,42 @@
+package com.example.test.crawler4j;
+
+import edu.uci.ics.crawler4j.crawler.CrawlConfig;
+import edu.uci.ics.crawler4j.crawler.CrawlController;
+import edu.uci.ics.crawler4j.fetcher.PageFetcher;
+import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;
+import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class FirstCrawlerController {
+
+ public static void main(String[] args) throws Exception {
+ String crawlStorageFolder = "/data/crawl/root";
+ int numberOfCrawlers = 1;
+
+ CrawlConfig config = new CrawlConfig();
+ config.setCrawlStorageFolder(crawlStorageFolder);
+
+ /*
+ * Instantiate the controller for this crawl.
+ */
+ PageFetcher pageFetcher = new PageFetcher(config);
+ RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
+ RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
+ CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
+
+ /*
+ * For each crawl, you need to add some seed urls. These are the first
+ * URLs that are fetched and then the crawler starts following links
+ * which are found in these pages
+ */
+ controller.addSeed("http://www.gewara.com/movie/208315566");
+
+ /*
+ * Start the crawl. This is a blocking operation, meaning that your code
+ * will reach the line after this only when crawling is finished.
+ */
+ controller.start(FirstCrawler.class, numberOfCrawlers);
+ }
+}
diff --git a/Crawler/src/main/java/com/example/test/jsoup/JsoupFirstTest.java b/Crawler/src/main/java/com/example/test/jsoup/JsoupFirstTest.java
new file mode 100644
index 0000000..3ff79d5
--- /dev/null
+++ b/Crawler/src/main/java/com/example/test/jsoup/JsoupFirstTest.java
@@ -0,0 +1,57 @@
+package com.example.test.jsoup;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class JsoupFirstTest {
+
+ public static void main(String[] args) throws IOException {
+// Document doc = Jsoup.connect("http://www.gewara.com/movie/ajax/getOpiItem.xhtml?movieid=208315566&fyrq=2015-01-09&cid=1").userAgent("Mozilla").get();
+ Document doc = Jsoup.connect("http://www.gewara.com/movie/searchCinema.xhtml?countycode=310115").userAgent("Mozilla").get();
+
+
+ System.out.println(doc);
+
+
+ Elements links = doc.select("a[href^=/movie][target=_blank][class=color3]");
+// Document doc = Jsoup.connect("http://example.com")
+// .data("query", "Java")
+// .userAgent("Mozilla")
+// .cookie("auth", "token")
+// .timeout(3000)
+// .post();
+
+ {
+// Element link = doc.select("a").first();
+// String relHref = link.attr("href"); // == "/"
+// String absHref = link.attr("abs:href"); // "http://www.open-open.com/"
+//
+// System.out.println(relHref);
+// System.out.println(absHref);
+ }
+
+
+// Element element = doc.select("div.chooseOpi_body").first();
+// Elements lis = element.select("li");
+//
+//
+// for (Element li : lis) {
+//
+// Movie movie = new Movie();
+// movie.setStartTime(li.select("span.opitime").first().child(0).text());
+// movie.setPrice(li.select("span.opiPrice").first().child(0).text());
+//// if (li.select("span.opiSales").first() != null){
+//// movie.setSale(li.select("span.opiSales").first().tagName("b").child(1).text() +li.select("span.opiSales").first().tagName("b").child(1).text());
+//// }
+// System.out.println(movie.toString());
+// }
+
+
+ }
+}
diff --git a/Crawler/src/main/java/com/example/test/jsoup/Movie.java b/Crawler/src/main/java/com/example/test/jsoup/Movie.java
new file mode 100644
index 0000000..30f33ba
--- /dev/null
+++ b/Crawler/src/main/java/com/example/test/jsoup/Movie.java
@@ -0,0 +1,67 @@
+package com.example.test.jsoup;
+
+import com.google.common.base.Objects;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class Movie {
+
+ private String startTime;
+ private String price;
+ private String address;
+ private String sale;
+ private String movieName;
+
+ public String getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(String startTime) {
+ this.startTime = startTime;
+ }
+
+ public String getPrice() {
+ return price;
+ }
+
+ public void setPrice(String price) {
+ this.price = price;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getSale() {
+ return sale;
+ }
+
+ public void setSale(String sale) {
+ this.sale = sale;
+ }
+
+
+ public String getMovieName() {
+ return movieName;
+ }
+
+ public void setMovieName(String movieName) {
+ this.movieName = movieName;
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this)
+ .add("startTime", startTime)
+ .add("price", price)
+ .add("address", address)
+ .add("sale", sale)
+ .add("movieName", movieName)
+ .toString();
+ }
+}
diff --git a/Crawler/src/main/java/com/example/test/nutch/NutchFirstTest.java b/Crawler/src/main/java/com/example/test/nutch/NutchFirstTest.java
new file mode 100644
index 0000000..744f7bd
--- /dev/null
+++ b/Crawler/src/main/java/com/example/test/nutch/NutchFirstTest.java
@@ -0,0 +1,49 @@
+package com.example.test.nutch;
+
+/**
+ * Created by Loon on 2015/1/9.
+ */
+public class NutchFirstTest {
+
+ public static void main(String[] args) {
+// try {
+// // define a keyword for the search
+// String nutchSearchString = "smart";
+//
+// // configure nutch
+// Configuration nutchConf = NutchConfiguration.create();
+// NutchBean nutchBean = new NutchBean(nutchConf);
+// // build the query
+// Query nutchQuery = Query.parse(nutchSearchString, nutchConf);
+// // optionally specify the maximum number of hits (default is 10)
+// // nutchQuery.getParams().setNumHits(100);
+// // nutchQuery.getParams().setMaxHitsPerDup(100);
+// Hits nutchHits = nutchBean.search(nutchQuery);
+//
+// // display the number of hits
+// System.out.println("Found " + nutchHits.getLength() + " hits.\n");
+//
+// // get the details about each hit (includes title, URL, a summary
+// // and the date when this was fetched)
+// for (int i = 0; i < nutchHits.getLength(); i++) {
+// Hit hit = nutchHits.getHit(i);
+// HitDetails details = nutchBean.getDetails(hit);
+// String title = details.getValue("title");
+// String url = details.getValue("url");
+// String summary = nutchBean.getSummary(details, nutchQuery)
+// .toString();
+// System.out.println("Title is: " + title);
+// System.out.println("(" + url + ")");
+// Date date = new Date(nutchBean.getFetchDate(details));
+// System.out.println("Date Fetched: " + date);
+// System.out.println(summary + "\n");
+// System.out.println("----------------------------------------");
+// }
+//
+// // as usually, don't forget to close the resources
+// nutchBean.close();
+// } catch (Throwable e) {
+// e.printStackTrace();
+// }
+ }
+}
diff --git a/Crawler/src/test/java/com/example/service/impl/GewaraMovieServiceImplTest.java b/Crawler/src/test/java/com/example/service/impl/GewaraMovieServiceImplTest.java
new file mode 100644
index 0000000..27ede80
--- /dev/null
+++ b/Crawler/src/test/java/com/example/service/impl/GewaraMovieServiceImplTest.java
@@ -0,0 +1,43 @@
+package com.example.service.impl;
+
+import com.example.service.MovieService;
+import com.example.test.jsoup.Movie;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+public class GewaraMovieServiceImplTest {
+
+ private MovieService movieService;
+
+ @Before
+ public void setUp() throws Exception {
+ this.movieService = new GewaraMovieServiceImpl();
+ }
+
+ @Test
+ public void testGetMovieList() throws Exception {
+
+ }
+
+ @Test
+ public void testGetMovieList1() throws Exception {
+
+ }
+
+ @Test
+ public void testGetMovieList2() throws Exception {
+
+ List movieList = movieService.getMovieList("博物馆奇妙夜3");
+
+ if (movieList != null) {
+
+ for (Movie movie : movieList) {
+ System.out.println("====================");
+ System.out.println(movie.toString());
+ System.out.println("====================");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/DesignPatterns/DesignPatterns.iml b/DesignPatterns/DesignPatterns.iml
index c46d21f..0696add 100644
--- a/DesignPatterns/DesignPatterns.iml
+++ b/DesignPatterns/DesignPatterns.iml
@@ -1,16 +1,26 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/DesignPatterns/pom.xml b/DesignPatterns/pom.xml
new file mode 100644
index 0000000..1f5562b
--- /dev/null
+++ b/DesignPatterns/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+
+ DesignPatterns
+ 1.0-SNAPSHOT
+
+
\ No newline at end of file
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/BombedMazeFactory.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/BombedMazeFactory.java
new file mode 100644
index 0000000..5b972f9
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/BombedMazeFactory.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class BombedMazeFactory {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/BombedWall.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/BombedWall.java
new file mode 100644
index 0000000..4c9d968
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/BombedWall.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class BombedWall {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/Direction.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Direction.java
new file mode 100644
index 0000000..a9ed2e0
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Direction.java
@@ -0,0 +1,11 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public enum Direction {
+ North,
+ South,
+ East,
+ West;
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/Door.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Door.java
new file mode 100644
index 0000000..45bff9d
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Door.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class Door {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/DoorNeedingSpell.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/DoorNeedingSpell.java
new file mode 100644
index 0000000..3db207c
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/DoorNeedingSpell.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class DoorNeedingSpell {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedMaze.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedMaze.java
new file mode 100644
index 0000000..066e525
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedMaze.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class EnchantedMaze {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedMazeFactory.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedMazeFactory.java
new file mode 100644
index 0000000..f095ca1
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedMazeFactory.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class EnchantedMazeFactory {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedRoom.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedRoom.java
new file mode 100644
index 0000000..b4fe5c5
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/EnchantedRoom.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class EnchantedRoom {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/MapSite.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/MapSite.java
new file mode 100644
index 0000000..054df00
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/MapSite.java
@@ -0,0 +1,10 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class MapSite {
+ public void enter(){
+
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/Maze.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Maze.java
new file mode 100644
index 0000000..396e8c7
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Maze.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class Maze {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/MazeFactory.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/MazeFactory.java
new file mode 100644
index 0000000..a51e0e9
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/MazeFactory.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class MazeFactory {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/MazeGame.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/MazeGame.java
new file mode 100644
index 0000000..77b9b49
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/MazeGame.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class MazeGame {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/Room.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Room.java
new file mode 100644
index 0000000..588099f
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Room.java
@@ -0,0 +1,8 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class Room extends MapSite {
+
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/RoomWithBombed.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/RoomWithBombed.java
new file mode 100644
index 0000000..ced59ab
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/RoomWithBombed.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class RoomWithBombed {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/Wall.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Wall.java
new file mode 100644
index 0000000..0a96564
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/Wall.java
@@ -0,0 +1,7 @@
+package com.gof.abstractFactory;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class Wall {
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/abstractFactory/package-info.java b/DesignPatterns/src/main/java/com/GoF/abstractFactory/package-info.java
new file mode 100644
index 0000000..7ab4678
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/abstractFactory/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Created by Loon on 14-7-12.
+ */
+package com.gof.abstractFactory;
\ No newline at end of file
diff --git a/DesignPatterns/src/main/java/com/GoF/builder/MazeBuilder.java b/DesignPatterns/src/main/java/com/GoF/builder/MazeBuilder.java
new file mode 100644
index 0000000..8e43e19
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/builder/MazeBuilder.java
@@ -0,0 +1,16 @@
+package com.GoF.builder;
+
+/**
+ * Created by Loon on 2014/7/14.
+ */
+public abstract class MazeBuilder {
+ abstract void buildMaze();
+
+ abstract void buildRoom(int roomNumber);
+
+ abstract void buildDoor(int roomFrom, int roomTo);
+
+// Maze getMaze(){
+// return 0;
+// }
+}
diff --git a/DesignPatterns/src/main/java/com/GoF/builder/StandardMazeBuilder.java b/DesignPatterns/src/main/java/com/GoF/builder/StandardMazeBuilder.java
new file mode 100644
index 0000000..debe448
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/GoF/builder/StandardMazeBuilder.java
@@ -0,0 +1,21 @@
+package com.GoF.builder;
+
+/**
+ * Created by Loon on 2014/7/14.
+ */
+public class StandardMazeBuilder extends MazeBuilder {
+ @Override
+ void buildMaze() {
+
+ }
+
+ @Override
+ void buildRoom(int roomNumber) {
+
+ }
+
+ @Override
+ void buildDoor(int roomFrom, int roomTo) {
+
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/builder/BuildProduct.java b/DesignPatterns/src/main/java/com/example/builder/BuildProduct.java
new file mode 100644
index 0000000..164e69c
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/builder/BuildProduct.java
@@ -0,0 +1,7 @@
+package com.example.builder;
+
+/**
+ * Created by Loon on 2014/7/14.
+ */
+public class BuildProduct {
+}
diff --git a/DesignPatterns/src/main/java/com/example/builder/Builder.java b/DesignPatterns/src/main/java/com/example/builder/Builder.java
new file mode 100644
index 0000000..8f548c7
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/builder/Builder.java
@@ -0,0 +1,12 @@
+package com.example.builder;
+
+/**
+ * Created by Loon on 2014/7/14.
+ */
+public abstract class Builder {
+ protected BuildProduct product;
+
+ abstract public void buildPartA(char c);
+
+ abstract public void buildPartB(char c);
+}
diff --git a/DesignPatterns/src/main/java/com/example/builder/ConcreteBuilderA.java b/DesignPatterns/src/main/java/com/example/builder/ConcreteBuilderA.java
new file mode 100644
index 0000000..ade30c0
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/builder/ConcreteBuilderA.java
@@ -0,0 +1,16 @@
+package com.example.builder;
+
+/**
+ * Created by Loon on 2014/7/14.
+ */
+public class ConcreteBuilderA extends Builder {
+ @Override
+ public void buildPartA(char c) {
+
+ }
+
+ @Override
+ public void buildPartB(char c) {
+
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/builder/Director.java b/DesignPatterns/src/main/java/com/example/builder/Director.java
new file mode 100644
index 0000000..a00e882
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/builder/Director.java
@@ -0,0 +1,22 @@
+package com.example.builder;
+
+/**
+ * Created by Loon on 2014/7/14.
+ */
+public class Director {
+
+ private Builder builder;
+
+ public Director(Builder b) {
+ builder = b;
+ }
+
+ public void convert(String string) {
+ for (int i = 0; i < string.length(); i++) {
+ if (i % 2 == 0)
+ builder.buildPartA(string.charAt(i));
+ else
+ builder.buildPartB(string.charAt(i));
+ }
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/AvgCalculator.java b/DesignPatterns/src/main/java/com/example/decorator/example1/AvgCalculator.java
new file mode 100644
index 0000000..575b351
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/AvgCalculator.java
@@ -0,0 +1,20 @@
+package com.example.decorator.example1;
+
+import java.util.List;
+
+/**
+ * 计算平均值
+ * Created by Loon on 2015/3/12.
+ */
+public class AvgCalculator extends CalculatorComponent {
+ @Override
+ public double getResult(List list) {
+ double sum = 0;
+
+ for (Double aList : list) {
+ sum += aList;
+ }
+
+ return sum / (list.size() == 0 ? 1 : list.size());
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/CalculatorComponent.java b/DesignPatterns/src/main/java/com/example/decorator/example1/CalculatorComponent.java
new file mode 100644
index 0000000..2385451
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/CalculatorComponent.java
@@ -0,0 +1,11 @@
+package com.example.decorator.example1;
+
+import java.util.List;
+
+/**
+ * Created by Loon on 2015/3/12.
+ */
+public abstract class CalculatorComponent {
+
+ public abstract double getResult(List list);
+}
\ No newline at end of file
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/CalculatorDecorator.java b/DesignPatterns/src/main/java/com/example/decorator/example1/CalculatorDecorator.java
new file mode 100644
index 0000000..bcbc899
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/CalculatorDecorator.java
@@ -0,0 +1,18 @@
+package com.example.decorator.example1;
+
+import java.util.List;
+
+/**
+ * 计算器指针,包装类
+ * Created by Loon on 2015/3/12.
+ */
+public abstract class CalculatorDecorator extends CalculatorComponent {
+
+ protected CalculatorComponent calculatorComponent;
+
+ public CalculatorDecorator(CalculatorComponent calculatorComponent) {
+ this.calculatorComponent = calculatorComponent;
+ }
+
+ public abstract double getResult(List list);
+}
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/Client.java b/DesignPatterns/src/main/java/com/example/decorator/example1/Client.java
new file mode 100644
index 0000000..34ba88f
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/Client.java
@@ -0,0 +1,30 @@
+package com.example.decorator.example1;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by Loon on 2015/3/12.
+ */
+public class Client {
+
+ public static void main(String[] args) {
+
+ List list = new ArrayList<>();
+
+ for (int i = 0; i < 21; i++) {
+ list.add(Math.random() *100);
+
+ }
+ System.out.println(Arrays.toString(list.toArray()));
+
+ CalculatorComponent avg = new AvgCalculator();
+ CalculatorDecorator overAvgCalculator= new OverAvgCalculator(avg);
+ CalculatorDecorator varianceCalculator= new VarianceCalculator(overAvgCalculator);
+
+ System.out.println(varianceCalculator.getResult(list));
+
+ }
+
+}
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/OverAvgCalculator.java b/DesignPatterns/src/main/java/com/example/decorator/example1/OverAvgCalculator.java
new file mode 100644
index 0000000..45233ae
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/OverAvgCalculator.java
@@ -0,0 +1,27 @@
+package com.example.decorator.example1;
+
+import java.util.List;
+
+/**
+ * Created by Loon on 2015/3/12.
+ */
+public class OverAvgCalculator extends CalculatorDecorator {
+
+ public OverAvgCalculator(CalculatorComponent calculatorComponent) {
+ super(calculatorComponent);
+ }
+
+ @Override
+ public double getResult(List list) {
+ double result = calculatorComponent.getResult(list);
+ int count = 0;
+ for (Double aList : list) {
+ if (aList >= result) {
+ count++;
+ }
+ }
+ System.out.println(count + "个高于平均值");
+
+ return result;
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/VarianceCalculator.java b/DesignPatterns/src/main/java/com/example/decorator/example1/VarianceCalculator.java
new file mode 100644
index 0000000..903c14a
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/VarianceCalculator.java
@@ -0,0 +1,30 @@
+package com.example.decorator.example1;
+
+import java.util.List;
+
+/**
+ * Created by Loon on 2015/3/12.
+ */
+public class VarianceCalculator extends CalculatorDecorator {
+
+ public VarianceCalculator(CalculatorComponent calculatorComponent) {
+ super(calculatorComponent);
+ }
+
+ @Override
+ public double getResult(List list) {
+ double result = calculatorComponent.getResult(list);
+
+ if (list.size() > 20) {
+ double num = 0;
+ for (Double aList : list) {
+ num += (aList - result) * (aList - result);
+ }
+ System.out.println(list.size() + "个数的方差是 " + (num / list.size()));
+ } else {
+ System.out.println("样本数量不足20个不计算方差");
+ }
+
+ return result;
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/decorator/example1/package-info.java b/DesignPatterns/src/main/java/com/example/decorator/example1/package-info.java
new file mode 100644
index 0000000..815280e
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/decorator/example1/package-info.java
@@ -0,0 +1,17 @@
+/**
+ * @link http://blog.csdn.net/sadfishsc/article/details/7307309
+ * 设计模式 策略模式
+ * 通过包装类实现额外功能,无需改变原有结构
+ * Created by Loon on 2015/3/12.
+ *
+ * 1. 装饰对象和真实对象拥有相同的接口或父类;
+
+2. 装饰对象中包含真实对象的引用,真实对象包装在装饰对象中;
+
+3. 客户端中不再操作真实对象,而是通过装饰对象把请求/参数传递给真实对象,通过装饰对象来操作真实对象;
+
+4. 装饰对象在操作真实对象之前或之后可以进行一些额外的操作以满足特定的需求;
+
+5. 如果包裹多个装饰对象,那么装饰对象的操作是有序的:越在外层的装饰对象越先执行。
+ */
+package com.example.decorator.example1;
\ No newline at end of file
diff --git a/DesignPatterns/src/main/java/com/loon/proxy/DecoratorDemo.java b/DesignPatterns/src/main/java/com/example/decorator/example2/DecoratorDemo.java
similarity index 97%
rename from DesignPatterns/src/main/java/com/loon/proxy/DecoratorDemo.java
rename to DesignPatterns/src/main/java/com/example/decorator/example2/DecoratorDemo.java
index ce0ba92..21df1a3 100644
--- a/DesignPatterns/src/main/java/com/loon/proxy/DecoratorDemo.java
+++ b/DesignPatterns/src/main/java/com/example/decorator/example2/DecoratorDemo.java
@@ -1,4 +1,4 @@
-package com.loon.proxy;
+package com.example.decorator.example2;
import java.util.Calendar;
diff --git a/DesignPatterns/src/main/java/com/example/facade/Client.java b/DesignPatterns/src/main/java/com/example/facade/Client.java
new file mode 100644
index 0000000..379a6ad
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/facade/Client.java
@@ -0,0 +1,12 @@
+package com.example.facade;
+
+/**
+ * Created by Loon on 2014/8/18.
+ */
+public class Client {
+
+ public static void main(String[] args) {
+ PostOffice postOffice = new PostOffice();
+ postOffice.sendLetter("test", "address");
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/facade/LetterProcess.java b/DesignPatterns/src/main/java/com/example/facade/LetterProcess.java
new file mode 100644
index 0000000..8524ef7
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/facade/LetterProcess.java
@@ -0,0 +1,15 @@
+package com.example.facade;
+
+/**
+ * Created by Loon on 2014/8/18.
+ */
+public interface LetterProcess {
+
+ public void writeContext(String context);
+
+ public void fillEnvelope(String address);
+
+ public void letterIntoEnvelope();
+
+ public void sendLetter();
+}
diff --git a/DesignPatterns/src/main/java/com/example/facade/LetterProcessImpl.java b/DesignPatterns/src/main/java/com/example/facade/LetterProcessImpl.java
new file mode 100644
index 0000000..dc4ec4e
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/facade/LetterProcessImpl.java
@@ -0,0 +1,26 @@
+package com.example.facade;
+
+/**
+ * Created by Loon on 2014/8/18.
+ */
+public class LetterProcessImpl implements LetterProcess {
+ @Override
+ public void writeContext(String context) {
+ System.out.println("write" + context);
+ }
+
+ @Override
+ public void fillEnvelope(String address) {
+ System.out.println("fill");
+ }
+
+ @Override
+ public void letterIntoEnvelope() {
+ System.out.println("into");
+ }
+
+ @Override
+ public void sendLetter() {
+ System.out.println("send");
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/facade/PostOffice.java b/DesignPatterns/src/main/java/com/example/facade/PostOffice.java
new file mode 100644
index 0000000..cb29741
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/facade/PostOffice.java
@@ -0,0 +1,18 @@
+package com.example.facade;
+
+/**
+ * Created by Loon on 2014/8/18.
+ */
+public class PostOffice {
+
+ private LetterProcess letterProcess = new LetterProcessImpl();
+
+ public void sendLetter(String context, String address) {
+
+ letterProcess.writeContext(context);
+ letterProcess.fillEnvelope(address);
+ letterProcess.letterIntoEnvelope();
+ letterProcess.sendLetter();
+
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/facade/package-info.java b/DesignPatterns/src/main/java/com/example/facade/package-info.java
new file mode 100644
index 0000000..d620a75
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/facade/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * facade 封装内部子系统,对外提供一个高层次的接口。
+ * Created by Loon on 2014/8/18.
+ */
+package com.example.facade;
\ No newline at end of file
diff --git a/DesignPatterns/src/main/java/com/example/prototype/Client.java b/DesignPatterns/src/main/java/com/example/prototype/Client.java
new file mode 100644
index 0000000..18a0bdb
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/prototype/Client.java
@@ -0,0 +1,20 @@
+package com.example.prototype;
+
+/**
+ * Created by Loon on 2014/8/20.
+ */
+public class Client {
+ public static void main(String[] args) throws CloneNotSupportedException {
+
+ Mail mail = new Mail(new Template());
+
+ for (int i = 0; i < 2; i++) {
+ Mail cloneMail = mail.clone();
+ sendMail(cloneMail);
+ }
+ }
+
+ private static void sendMail(Mail cloneMail) {
+ System.out.println("send Mail finish" + cloneMail.getContext());
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/prototype/Mail.java b/DesignPatterns/src/main/java/com/example/prototype/Mail.java
new file mode 100644
index 0000000..3d2a683
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/prototype/Mail.java
@@ -0,0 +1,22 @@
+package com.example.prototype;
+
+/**
+ * Created by Loon on 2014/8/20.
+ */
+public class Mail implements Cloneable {
+
+ private String context;
+
+ public Mail(Template template) {
+ this.context = template.getContext();
+ }
+
+ @Override
+ protected Mail clone() throws CloneNotSupportedException {
+ return (Mail) super.clone();
+ }
+
+ public String getContext() {
+ return context;
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/prototype/Template.java b/DesignPatterns/src/main/java/com/example/prototype/Template.java
new file mode 100644
index 0000000..5c896b9
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/prototype/Template.java
@@ -0,0 +1,13 @@
+package com.example.prototype;
+
+/**
+ * Created by Loon on 2014/8/20.
+ */
+public class Template {
+
+ private String context = "Hello,";
+
+ public String getContext() {
+ return context;
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorld.java b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorld.java
new file mode 100644
index 0000000..5621e9f
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorld.java
@@ -0,0 +1,9 @@
+package com.example.proxy.simpleExample;
+
+/**
+ * Created by Loon on 2014/5/8.
+ */
+public interface HelloWorld {
+
+ public void sayHello();
+}
diff --git a/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldHandler.java b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldHandler.java
new file mode 100644
index 0000000..91a98ad
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldHandler.java
@@ -0,0 +1,27 @@
+package com.example.proxy.simpleExample;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+/**
+ * Created by Loon on 2014/5/8.
+ */
+public class HelloWorldHandler implements InvocationHandler {
+
+ private Object targetObject;
+
+ public HelloWorldHandler(Object targetObject) {
+ this.targetObject = targetObject;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ System.out.println("方法调用前");
+
+ Object result = method.invoke(this.targetObject, args);
+
+ System.out.println("方法调用结束");
+
+ return result;
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldImpl.java b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldImpl.java
new file mode 100644
index 0000000..9989211
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldImpl.java
@@ -0,0 +1,11 @@
+package com.example.proxy.simpleExample;
+
+/**
+ * Created by Loon on 2014/5/8.
+ */
+public class HelloWorldImpl implements HelloWorld {
+ @Override
+ public void sayHello() {
+ System.out.println("sayHello :=============");
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldImplTest.java b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldImplTest.java
new file mode 100644
index 0000000..04ca052
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/proxy/simpleExample/HelloWorldImplTest.java
@@ -0,0 +1,20 @@
+package com.example.proxy.simpleExample;
+
+
+import java.lang.reflect.Proxy;
+
+public class HelloWorldImplTest {
+
+ public static void main(String[] args) {
+
+ HelloWorld obj = new HelloWorldImpl();
+
+ HelloWorldHandler handler = new HelloWorldHandler(obj);
+
+// HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
+
+ HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
+
+ proxy.sayHello();
+ }
+}
\ No newline at end of file
diff --git a/DesignPatterns/src/main/java/com/example/singleton/AmericaPresident.java b/DesignPatterns/src/main/java/com/example/singleton/AmericaPresident.java
new file mode 100644
index 0000000..89986e3
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/singleton/AmericaPresident.java
@@ -0,0 +1,19 @@
+package com.example.singleton;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * @link http://www.programcreek.com/2011/07/java-design-pattern-singleton/
+ */
+public class AmericaPresident {
+ private static AmericaPresident thePresident;
+
+ private AmericaPresident() {
+ }
+
+ public static AmericaPresident getPresident() {
+ if (thePresident == null)
+ thePresident = new AmericaPresident();
+ return thePresident;
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/example/singleton/SingletonExample.java b/DesignPatterns/src/main/java/com/example/singleton/SingletonExample.java
new file mode 100644
index 0000000..f29ceaf
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/example/singleton/SingletonExample.java
@@ -0,0 +1,20 @@
+package com.example.singleton;
+
+/**
+ * Created by Loon on 2014/4/23.
+ *
+ * @link http://www.cnblogs.com/zuoxiaolong/p/3263085.html
+ */
+public class SingletonExample {
+
+ private SingletonExample() {
+ }
+
+ public static SingletonExample getInstance() {
+ return SingletonInstance.instance;
+ }
+
+ private static class SingletonInstance {
+ static SingletonExample instance = new SingletonExample();
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/maze/Direction.java b/DesignPatterns/src/main/java/com/maze/Direction.java
new file mode 100644
index 0000000..8eca9ce
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/maze/Direction.java
@@ -0,0 +1,11 @@
+package com.maze;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public enum Direction {
+ North,
+ South,
+ East,
+ West;
+}
diff --git a/DesignPatterns/src/main/java/com/maze/MapSite.java b/DesignPatterns/src/main/java/com/maze/MapSite.java
new file mode 100644
index 0000000..86508c6
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/maze/MapSite.java
@@ -0,0 +1,10 @@
+package com.maze;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class MapSite {
+ public void enter() {
+
+ }
+}
diff --git a/DesignPatterns/src/main/java/com/maze/Room.java b/DesignPatterns/src/main/java/com/maze/Room.java
new file mode 100644
index 0000000..6a0f792
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/maze/Room.java
@@ -0,0 +1,8 @@
+package com.maze;
+
+/**
+ * Created by Loon on 14-7-12.
+ */
+public class Room extends MapSite {
+
+}
diff --git a/DesignPatterns/src/main/java/com/maze/package-info.java b/DesignPatterns/src/main/java/com/maze/package-info.java
new file mode 100644
index 0000000..776bdc9
--- /dev/null
+++ b/DesignPatterns/src/main/java/com/maze/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Created by Loon on 14-7-12.
+ */
+package com.maze;
\ No newline at end of file
diff --git a/ETL/pom.xml b/ETL/pom.xml
new file mode 100644
index 0000000..7bddcef
--- /dev/null
+++ b/ETL/pom.xml
@@ -0,0 +1,77 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ ETL
+
+
+ 5.3.0.0-200
+
+
+ com.oracle
+ ojdbc14
+ 10.2.0.4.0
+
+
+
+
+
+
+ pentaho-kettle
+ kettle-core
+ ${pentaho.kettle.version}
+
+
+ pentaho-kettle
+ kettle-engine
+ ${pentaho.kettle.version}
+
+
+
+ javax.mail
+ mail
+ 1.4.7
+
+
+
+ org.mozilla
+ rhino
+ 1.7R4
+
+
+
+ ${jdbc.driver.groupId}
+ ${jdbc.driver.artifactId}
+ ${jdbc.driver.version}
+
+
+
+
+
+ org.apache.poi
+ poi
+ 3.10-FINAL
+
+
+ org.apache.poi
+ poi-ooxml
+ 3.10-FINAL
+
+
+
+
+
+ pentaho-releases
+ http://repository.pentaho.org/artifactory/repo/
+
+
+
+
+
\ No newline at end of file
diff --git a/ETL/src/main/java/ETLTest.java b/ETL/src/main/java/ETLTest.java
new file mode 100644
index 0000000..8debbc7
--- /dev/null
+++ b/ETL/src/main/java/ETLTest.java
@@ -0,0 +1,89 @@
+import com.google.common.collect.Maps;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
+import org.pentaho.di.core.KettleEnvironment;
+import org.pentaho.di.core.exception.KettleException;
+import org.pentaho.di.core.util.EnvUtil;
+import org.pentaho.di.trans.Trans;
+import org.pentaho.di.trans.TransMeta;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Created by Loon on 2014/7/28.
+ */
+public class ETLTest {
+
+
+ public static void main(String[] args) {
+
+// runTransformation("C:\\Users\\Desktop\\ETL\\set.ktr",null);
+
+ URL url = Resources.getResource("config.properties");
+ File file = new File(url.getFile());
+
+ Properties properties = new Properties();
+
+ try {
+ properties.load(Files.newReader(file, Charset.defaultCharset()));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ Map variableMap = Maps.fromProperties(properties);
+
+ runTransformation(Resources.getResource("test2.ktr").getFile(), variableMap); //
+// Map paramMap = new HashMap<>();
+// paramMap.put("CONFIG_DIR", "path");
+// runTransformation("path\\set.ktr", paramMap);
+
+// Type - "s"ystem, "r"oot, "p"arent, "g"randparent. Upto which level the variable is set.
+//
+// Java Virtual Machine:S系统级作用域,凡是在一个java虚拟机下运行的线程都受其影响。
+//
+// parent job:在当前作业下是生效的。
+//
+// grand-parent job:在当前作业的父作业下是生效的。
+//
+// the root job:R级作用域,凡是在跟作业下运行的都是生效的。
+
+ }
+
+ public static void runTransformation(String filename, Map paramMap) {
+
+ try {
+ KettleEnvironment.init();
+ EnvUtil.environmentInit();
+ TransMeta transMeta = new TransMeta(filename);
+ Trans trans = new Trans(transMeta);
+
+ if (paramMap != null && !paramMap.isEmpty()) {
+ for (Map.Entry paramEntry : paramMap.entrySet()) {
+ trans.setVariable(paramEntry.getKey(), paramEntry.getValue());
+ }
+ }
+
+ // set variavle. same can be retrieved using "Get Variables" step
+ //trans.setVariable("TEST_VARIABLE_FROM_JAVA", "This value is passsed from java");
+
+ // set parameter. same can be used inside steps in transformation
+ //trans.setParameterValue("JAVA_PARAM", "java param value");
+
+ trans.execute(null);
+ trans.waitUntilFinished();
+ if (trans.getErrors() > 0) {
+ throw new RuntimeException("There were errors during transformation execution.");
+ }
+ } catch (KettleException e) {
+ // TODO Put your exception-handling code here.
+ e.printStackTrace();
+ }
+ }
+
+
+}
diff --git a/ETL/src/main/resources/config.properties b/ETL/src/main/resources/config.properties
new file mode 100644
index 0000000..51e670a
--- /dev/null
+++ b/ETL/src/main/resources/config.properties
@@ -0,0 +1 @@
+test=test
\ No newline at end of file
diff --git a/ETL/src/main/resources/test2.ktr b/ETL/src/main/resources/test2.ktr
new file mode 100644
index 0000000..e69de29
diff --git a/Enum/Enum.iml b/Enum/Enum.iml
index c46d21f..0696add 100644
--- a/Enum/Enum.iml
+++ b/Enum/Enum.iml
@@ -1,16 +1,26 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/Enum/pom.xml b/Enum/pom.xml
new file mode 100644
index 0000000..7c25618
--- /dev/null
+++ b/Enum/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+
+ Enum
+ 1.0-SNAPSHOT
+
+
\ No newline at end of file
diff --git a/Enum/src/main/java/EnumMapExample.java b/Enum/src/main/java/EnumMapExample.java
new file mode 100644
index 0000000..82f1453
--- /dev/null
+++ b/Enum/src/main/java/EnumMapExample.java
@@ -0,0 +1,40 @@
+import java.util.EnumMap;
+import java.util.Map;
+
+/**
+ * Created by Loon on 2015/2/9.
+ */
+
+interface Command{
+ String getRealName();
+}
+
+
+public class EnumMapExample {
+
+ public static void main(String[] args) {
+
+ EnumMap enumMap= new EnumMap(Week.class);
+
+ enumMap.put(Week.MON,new Command() {
+ @Override
+ public String getRealName() {
+ return Week.MON.getChineseName();
+ }
+ });
+
+
+ enumMap.put(Week.FRI,new Command() {
+ @Override
+ public String getRealName() {
+ return Week.FRI.getChineseName();
+ }
+ });
+
+
+ for (Map.Entry weekCommandEntry : enumMap.entrySet()) {
+ System.out.printf("%s: %s%n", weekCommandEntry.getKey(), weekCommandEntry.getValue().getRealName());
+ }
+
+ }
+}
diff --git a/Enum/src/main/java/EnumSetExample.java b/Enum/src/main/java/EnumSetExample.java
new file mode 100644
index 0000000..965f411
--- /dev/null
+++ b/Enum/src/main/java/EnumSetExample.java
@@ -0,0 +1,22 @@
+import java.util.EnumSet;
+
+/**
+ * Created by Loon on 2015/2/6.
+ */
+
+public class EnumSetExample {
+
+ public static void main(String[] args) {
+
+ EnumSet weekEnumSet =EnumSet.noneOf(Week.class); // 初始化,创建空对象
+
+ weekEnumSet.add(Week.FRI);
+ System.out.println(weekEnumSet);
+ weekEnumSet.addAll(EnumSet.of(Week.MON,Week.TUS));
+ System.out.println(weekEnumSet);
+ weekEnumSet.removeAll(EnumSet.allOf(Week.class));
+ System.out.println(weekEnumSet);
+
+
+ }
+}
diff --git a/Enum/src/main/java/TrafficLight.java b/Enum/src/main/java/TrafficLight.java
new file mode 100644
index 0000000..e8b58b4
--- /dev/null
+++ b/Enum/src/main/java/TrafficLight.java
@@ -0,0 +1,40 @@
+import com.google.common.base.Objects;
+
+/**
+ * thinking in java; page no 1016
+ * Created by Loon on 2015/2/6.
+ */
+enum Signal {
+ GREEN, RED, YELLOW
+}
+
+public class TrafficLight {
+ Signal color = Signal.RED;
+
+ public static void main(String[] args) {
+ TrafficLight light = new TrafficLight();
+ for (int i = 0; i < 10; i++) {
+ System.out.println(light);
+ light.change();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "this traffic light is " + color;
+ }
+
+ private void change() {
+ switch (color) {
+ case RED:
+ color = Signal.GREEN;
+ break;
+ case GREEN:
+ color = Signal.YELLOW;
+ break;
+ case YELLOW:
+ color = Signal.RED;
+ break;
+ }
+ }
+}
diff --git a/Enum/src/main/java/Week.java b/Enum/src/main/java/Week.java
index 031ef8e..5b37e40 100644
--- a/Enum/src/main/java/Week.java
+++ b/Enum/src/main/java/Week.java
@@ -6,5 +6,16 @@
* To change this template use File | Settings | File Templates.
*/
public enum Week {
- MON, TUS, WEN, THUR, FRI, SAT, SUN
+
+ MON("星期一"), TUS("星期二"), WEN("星期三"), THUR("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日");
+
+ private String chineseName;
+
+ Week(String chineseName) {
+ this.chineseName = chineseName;
+ }
+
+ public String getChineseName() {
+ return chineseName;
+ }
}
diff --git a/Enum/src/main/java/com/example/roshambo/Item.java b/Enum/src/main/java/com/example/roshambo/Item.java
new file mode 100644
index 0000000..545be88
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/Item.java
@@ -0,0 +1,18 @@
+package com.example.roshambo;
+
+import com.example.roshambo.impl.Paper;
+import com.example.roshambo.impl.Rock;
+import com.example.roshambo.impl.Scissors;
+
+/**
+ * Created by Loon on 2015/2/9.
+ */
+public interface Item {
+ OutCome compete(Item item);
+
+ OutCome eval(Paper paper);
+
+ OutCome eval(Scissors scissors);
+
+ OutCome eval(Rock rock);
+}
diff --git a/Enum/src/main/java/com/example/roshambo/OutCome.java b/Enum/src/main/java/com/example/roshambo/OutCome.java
new file mode 100644
index 0000000..bd839e0
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/OutCome.java
@@ -0,0 +1,8 @@
+package com.example.roshambo;
+
+/**
+ * Created by Loon on 2015/2/9.
+ */
+public enum OutCome {
+ WIN, LOSE, DRAW
+}
diff --git a/Enum/src/main/java/com/example/roshambo/RoShamBo.java b/Enum/src/main/java/com/example/roshambo/RoShamBo.java
new file mode 100644
index 0000000..90d96e2
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/RoShamBo.java
@@ -0,0 +1,40 @@
+package com.example.roshambo;
+
+import com.example.roshambo.impl.Paper;
+import com.example.roshambo.impl.Rock;
+import com.example.roshambo.impl.Scissors;
+
+import java.util.Random;
+
+/**
+ * 自动分发
+ * Created by Loon on 2015/2/9.
+ */
+public class RoShamBo {
+ private static Random random =new Random();
+
+ public static void main(String[] args) {
+
+ for (int i = 0; i < 10; i++) {
+ match(newItem(), newItem());
+ }
+ }
+
+ private static void match(Item a, Item b) {
+
+ System.out.println(a + " vs " + b + ":" + a.compete(b));
+ }
+
+ private static Item newItem() {
+
+ switch (random.nextInt(7) / 3) {
+ default:
+ case 0:
+ return new Scissors();
+ case 1:
+ return new Paper();
+ case 2:
+ return new Rock();
+ }
+ }
+}
diff --git a/Enum/src/main/java/com/example/roshambo/RoShamBoLastVersion.java b/Enum/src/main/java/com/example/roshambo/RoShamBoLastVersion.java
new file mode 100644
index 0000000..fcab32c
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/RoShamBoLastVersion.java
@@ -0,0 +1,62 @@
+package com.example.roshambo;
+
+import java.util.Random;
+
+/**
+ * 借助表驱动法
+ * Created by Loon on 2015/2/10.
+ */
+public enum RoShamBoLastVersion {
+
+ PAPER(OutCome.DRAW, OutCome.LOSE, OutCome.WIN),
+ SCISSORS(OutCome.WIN, OutCome.DRAW, OutCome.LOSE),
+ ROCK(OutCome.LOSE, OutCome.WIN, OutCome.DRAW);
+
+ private OutCome vPAPER, vSCISSORS, vROCK;
+ private static Random random = new Random();
+
+ RoShamBoLastVersion(OutCome vPAPER, OutCome vSCISSORS, OutCome vROCK) {
+ this.vPAPER = vPAPER;
+ this.vSCISSORS = vSCISSORS;
+ this.vROCK = vROCK;
+ }
+
+ public OutCome compete(RoShamBoLastVersion roShamBoLastVersion) {
+ switch (roShamBoLastVersion) {
+ default:
+ case PAPER:
+ return vPAPER;
+ case SCISSORS:
+ return vSCISSORS;
+ case ROCK:
+ return vROCK;
+ }
+ }
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 20; i++) {
+ match(newRoShamBoLastVersion(), newRoShamBoLastVersion());
+ }
+ }
+
+ private static void match(RoShamBoLastVersion a, RoShamBoLastVersion b) {
+
+ System.out.println(a + " vs " + b + ":" + a.compete(b));
+ }
+
+
+ private static RoShamBoLastVersion newRoShamBoLastVersion() {
+
+ switch (random.nextInt(7) / 3) {
+ default:
+ case 0:
+ return RoShamBoLastVersion.SCISSORS;
+ case 1:
+ return RoShamBoLastVersion.PAPER;
+ case 2:
+ return RoShamBoLastVersion.ROCK;
+ }
+ }
+
+
+}
diff --git a/Enum/src/main/java/com/example/roshambo/impl/Paper.java b/Enum/src/main/java/com/example/roshambo/impl/Paper.java
new file mode 100644
index 0000000..5e49677
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/impl/Paper.java
@@ -0,0 +1,34 @@
+package com.example.roshambo.impl;
+
+import com.example.roshambo.Item;
+import com.example.roshambo.OutCome;
+
+/**
+ * Created by Loon on 2015/2/9.
+ */
+public class Paper implements Item {
+ @Override
+ public OutCome compete(Item item) {
+ return item.eval(this);
+ }
+
+ @Override
+ public OutCome eval(Paper paper) {
+ return OutCome.DRAW;
+ }
+
+ @Override
+ public OutCome eval(Scissors scissors) {
+ return OutCome.LOSE;
+ }
+
+ @Override
+ public OutCome eval(Rock rock) {
+ return OutCome.WIN;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName();
+ }
+}
diff --git a/Enum/src/main/java/com/example/roshambo/impl/Rock.java b/Enum/src/main/java/com/example/roshambo/impl/Rock.java
new file mode 100644
index 0000000..90d4c05
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/impl/Rock.java
@@ -0,0 +1,34 @@
+package com.example.roshambo.impl;
+
+import com.example.roshambo.Item;
+import com.example.roshambo.OutCome;
+
+/**
+ * Created by Loon on 2015/2/9.
+ */
+public class Rock implements Item {
+ @Override
+ public OutCome compete(Item item) {
+ return item.eval(this);
+ }
+
+ @Override
+ public OutCome eval(Paper paper) {
+ return OutCome.LOSE;
+ }
+
+ @Override
+ public OutCome eval(Scissors scissors) {
+ return OutCome.WIN;
+ }
+
+ @Override
+ public OutCome eval(Rock rock) {
+ return OutCome.DRAW;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName();
+ }
+}
diff --git a/Enum/src/main/java/com/example/roshambo/impl/Scissors.java b/Enum/src/main/java/com/example/roshambo/impl/Scissors.java
new file mode 100644
index 0000000..563a90c
--- /dev/null
+++ b/Enum/src/main/java/com/example/roshambo/impl/Scissors.java
@@ -0,0 +1,34 @@
+package com.example.roshambo.impl;
+
+import com.example.roshambo.Item;
+import com.example.roshambo.OutCome;
+
+/**
+ * Created by Loon on 2015/2/9.
+ */
+public class Scissors implements Item{
+ @Override
+ public OutCome compete(Item item) {
+ return item.eval(this);
+ }
+
+ @Override
+ public OutCome eval(Paper paper) {
+ return OutCome.WIN;
+ }
+
+ @Override
+ public OutCome eval(Scissors scissors) {
+ return OutCome.DRAW;
+ }
+
+ @Override
+ public OutCome eval(Rock rock) {
+ return OutCome.LOSE;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName();
+ }
+}
diff --git a/Enum/src/main/java/enumDemo.java b/Enum/src/main/java/enumDemo.java
index 0fcb5fb..8701056 100644
--- a/Enum/src/main/java/enumDemo.java
+++ b/Enum/src/main/java/enumDemo.java
@@ -5,10 +5,24 @@
* Time: 下午3:05
* To change this template use File | Settings | File Templates.
*/
+
+
+
public class enumDemo {
+
public static void main(String[] args) {
- System.out.printf(String.valueOf(Week.SAT));
+ System.out.println(String.valueOf(Week.SAT));
+ System.out.println(Week.SAT.ordinal());// 获取枚举实例在声明时的次序,从0开始
+ System.out.println(Week.SAT.getChineseName());
+
+ // System.out.println(SAT.ordinal());// 静态导入使用
+
+ for (Week week : Week.values()) { // 循环遍历枚举
+ System.out.println(week.getChineseName()+": "+week.ordinal()+"; EnglishName: "+week);
+ }
+
+
}
}
diff --git a/Generics/pom.xml b/Generics/pom.xml
new file mode 100644
index 0000000..a5dcbb1
--- /dev/null
+++ b/Generics/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Generics
+
+
+
\ No newline at end of file
diff --git a/Generics/src/main/java/typeinfo/ClassInitialization.java b/Generics/src/main/java/typeinfo/ClassInitialization.java
new file mode 100644
index 0000000..23544e4
--- /dev/null
+++ b/Generics/src/main/java/typeinfo/ClassInitialization.java
@@ -0,0 +1,61 @@
+package typeinfo;
+
+import java.util.Random;
+
+/**
+ * 类加载
+ * 1.load class
+ * 2.create ref
+ * 3.init
+ * Created by Loon on 2014/7/1.
+ */
+
+class Initable {
+ static final int staticfinal = 1;
+ static final int staticfinal2 = ClassInitialization.random.nextInt(100);
+
+ static {
+ System.out.println("inited1");
+ }
+
+}
+
+
+class Initable2 {
+ static int staticint = 2;
+
+ static {
+ System.out.println("inited2");
+ }
+}
+
+
+class Initable3 {
+ static int staticint = 3;
+
+ static {
+ System.out.println("inited3");
+ }
+}
+
+public class ClassInitialization {
+ public static Random random = new Random();
+
+ public static void main(String[] args) throws ClassNotFoundException {
+
+ /**
+ * static final 值是编译期常量 不需要经过初始化 可以直接使用
+ */
+ Class initable = Initable.class;
+ System.out.println("after create ref");
+ System.out.println(Initable.staticfinal);
+ System.out.println(Initable.staticfinal2);
+
+ System.out.println(Initable2.staticint);
+
+ Class initable3 = Class.forName("typeinfo.Initable3");
+ System.out.println("after create ref");
+ System.out.println(Initable3.staticint);
+
+ }
+}
diff --git a/Guava/pom.xml b/Guava/pom.xml
index 7ef80cf..463a8e2 100644
--- a/Guava/pom.xml
+++ b/Guava/pom.xml
@@ -1,29 +1,26 @@
-
4.0.0
- Guava
+
+ LearnJava
+ LearnJava
+ 1.0-SNAPSHOT
+
+
Guava
1.0-SNAPSHOT
-
- com.google.guava
- guava
- 16.0.1
-
- junit
- junit
- 4.11
- test
+ LearnJava
+ Common
+ 1.0-SNAPSHOT
-
-
\ No newline at end of file
diff --git a/Guava/src/main/java/com/loon/object/ObjectTest.java b/Guava/src/main/java/com/example/basic/ObjectTest.java
similarity index 88%
rename from Guava/src/main/java/com/loon/object/ObjectTest.java
rename to Guava/src/main/java/com/example/basic/ObjectTest.java
index 0774172..d5dbd67 100644
--- a/Guava/src/main/java/com/loon/object/ObjectTest.java
+++ b/Guava/src/main/java/com/example/basic/ObjectTest.java
@@ -1,4 +1,4 @@
-package com.loon.object;
+package com.example.basic;
import com.google.common.base.Objects;
@@ -10,7 +10,16 @@ public class ObjectTest {
private String name;
private String age;
+ public static void main(String[] args) {
+ ObjectTest objectTest = new ObjectTest();
+ objectTest.setAge("17");
+ objectTest.setName("test");
+
+ System.out.println(Objects.toStringHelper(objectTest).toString());
+
+
+ }
public String getAge() {
return age;
@@ -27,15 +36,4 @@ public String getName() {
public void setName(String name) {
this.name = name;
}
-
- public static void main(String[] args) {
-
- ObjectTest objectTest = new ObjectTest();
- objectTest.setAge("17");
- objectTest.setName("test");
-
- System.out.println(Objects.toStringHelper(objectTest).toString());
-
-
- }
}
diff --git a/Guava/src/main/java/com/example/basic/OptionalExample.java b/Guava/src/main/java/com/example/basic/OptionalExample.java
new file mode 100644
index 0000000..0cbe4cc
--- /dev/null
+++ b/Guava/src/main/java/com/example/basic/OptionalExample.java
@@ -0,0 +1,29 @@
+package com.example.basic;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Optional 用和避免null
+ * Created by Loon on 2015/1/26.
+ */
+public class OptionalExample {
+
+ public static void main(String[] args) {
+
+ Map stringMap = Maps.newHashMap();
+ stringMap.put("test", "test");
+ List