From f5db54db85aa9f76b80f4a494fbb296fb39c9a18 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 21 Aug 2016 15:52:41 +0800
Subject: [PATCH 01/62] [update] format code style
---
java-base/pom.xml | 1 -
.../java/base/constructor/FatherClass.java | 2 +-
.../java/base/constructor/SonClass.java | 2 +-
java-multithread/pom.xml | 1 -
.../communication/example1/MyList.java | 6 +--
.../example1/Run1_TwoThreadTransData.java | 2 +-
.../communication/example1/ThreadA.java | 4 +-
.../communication/example1/ThreadB.java | 4 +-
.../communication/example10/C_Thread.java | 4 +-
.../communication/example10/Consumer.java | 4 +-
.../communication/example10/MyStack.java | 18 ++++----
.../communication/example10/P_Thread.java | 4 +-
.../communication/example10/Producer.java | 6 +--
.../example10/Run10_oneP_manyC.java | 8 ++--
.../communication/example11/C_Thread.java | 4 +-
.../communication/example11/Consumer.java | 4 +-
.../communication/example11/MyStack.java | 18 ++++----
.../communication/example11/P_Thread.java | 4 +-
.../communication/example11/Producer.java | 6 +--
.../example11/Run11_manyP_manyC.java | 11 ++---
.../example11/Run11_manyP_oneC.java | 6 +--
.../example11/Run11_oneP_manyC.java | 7 ++--
.../communication/example12/ReadData.java | 8 ++--
.../example12/Run12_pipeInputOutput.java | 6 +--
.../communication/example12/ThreadRead.java | 2 +-
.../communication/example12/ThreadWrite.java | 2 +-
.../communication/example12/WriteData.java | 6 +--
.../communication/example13/DBTools.java | 12 +++---
.../example13/Run13_wait_notify_insert.java | 4 +-
.../communication/example14/Run14_join.java | 6 +--
.../example14/Run14_joinExption.java | 2 +-
.../example14/Run14_joinLong.java | 6 +--
.../communication/example14/ThreadA.java | 4 +-
.../communication/example14/ThreadC.java | 2 +-
.../example15/Run15_joinMore.java | 16 ++++---
.../example15/Run15_join_sleep_2.java | 10 ++---
.../communication/example15/ThreadA.java | 4 +-
.../communication/example15/ThreadB.java | 8 ++--
.../communication/example15/ThreadC.java | 4 +-
.../example16/InheritableThreadLocalExt2.java | 2 +-
.../Run16_InheritableThreadLocalExt.java | 4 +-
.../Run16_InheritableThreadLocalExt2.java | 4 +-
.../example16/Run16_ThreadLocal.java | 4 +-
.../communication/example16/ThreadA.java | 4 +-
.../communication/example16/ThreadB.java | 4 +-
.../communication/example16/ThreadC.java | 4 +-
.../example16/ThreadLocalExt.java | 2 +-
.../communication/example2/Run2_notify.java | 1 +
.../communication/example2/Run2_sleep.java | 25 ++++++-----
.../communication/example2/Run2_wait.java | 2 +-
.../communication/example2/Thread1.java | 8 ++--
.../communication/example2/Thread2.java | 8 ++--
.../communication/example3/NotifyThread.java | 2 +-
.../communication/example3/NotifyThread2.java | 2 +-
.../communication/example3/NotifyThread3.java | 2 +-
.../communication/example3/Service.java | 10 ++---
.../example4/Run4_waitHasParam.java | 8 ++--
.../example4/Run4_waitHasParam2.java | 17 ++++----
.../communication/example5/MyRun.java | 20 ++++-----
.../communication/example5/Run5_notify.java | 4 +-
.../example5/Run5_notifyEarly.java | 4 +-
.../communication/example6/Add.java | 4 +-
.../communication/example6/Run6_waitOld.java | 8 ++--
.../communication/example6/Subtract.java | 10 ++---
.../communication/example7/Consumer.java | 8 ++--
.../communication/example7/ThreadC.java | 4 +-
.../communication/example7/ThreadP.java | 4 +-
.../communication/example7/producer.java | 10 ++---
.../communication/example8/Consumer.java | 13 +++---
.../communication/example8/Producer.java | 15 ++++---
.../communication/example8/Run8_allWait.java | 17 ++++----
.../communication/example8/ThreadC.java | 6 +--
.../communication/example8/ThreadP.java | 5 +--
.../communication/example9/C_Thread.java | 4 +-
.../communication/example9/Consumer.java | 4 +-
.../communication/example9/MyStack.java | 18 ++++----
.../communication/example9/P_Thread.java | 4 +-
.../communication/example9/Producer.java | 7 ++--
.../example9/Run9_oneP_manyC.java | 2 -
.../example9/Run9_oneP_oneC.java | 3 +-
.../example1/Run1_UseConditionWaitNotify.java | 1 -
.../Run1_UseConditionWaitNotifyError.java | 1 -
.../Run1_UseConditionWaitNotifyOk.java | 1 -
.../multithread/lock/example1/ServiceA.java | 2 +-
.../multithread/lock/example1/ServiceB.java | 4 +-
.../multithread/lock/example1/ServiceC.java | 10 ++---
.../example10/Run10_ReadWriteLockBegin1.java | 4 +-
.../example10/Run10_ReadWriteLockBegin2.java | 4 +-
.../example10/Run10_ReadWriteLockBegin3.java | 4 +-
.../lock/example10/Run10_condition.java | 42 +++++++++----------
.../multithread/lock/example10/Service1.java | 4 +-
.../multithread/lock/example10/Service2.java | 4 +-
.../multithread/lock/example10/Service3.java | 8 ++--
.../multithread/lock/example2/MyService.java | 29 +++++++------
.../multithread/lock/example2/ThreadA.java | 2 +-
.../multithread/lock/example2/ThreadB.java | 2 +-
.../multithread/lock/example3/MyService.java | 22 +++++-----
.../example3/Run3_ConditionManyToMany.java | 2 +-
.../multithread/lock/example3/ThreadA.java | 6 +--
.../multithread/lock/example3/ThreadB.java | 6 +--
.../multithread/lock/example4/Run4_Fair.java | 7 ++--
.../lock/example4/Run4_notFair.java | 7 ++--
.../multithread/lock/example4/Service.java | 4 +-
.../lock/example5/Run5_getHoldCount.java | 2 -
.../lock/example5/Run5_getQueueLength.java | 8 ++--
.../example5/Run5_getWaitQueueLength.java | 8 ++--
.../multithread/lock/example5/Service1.java | 9 ++--
.../multithread/lock/example5/Service2.java | 4 +-
.../multithread/lock/example5/Service3.java | 11 ++---
.../lock/example6/Run6_hasQueueThread.java | 2 +-
.../lock/example6/Run6_hasWaiters.java | 6 +--
.../multithread/lock/example6/Service1.java | 2 +-
.../multithread/lock/example6/Service2.java | 3 +-
.../lock/example7/Run7_isFair.java | 4 +-
.../example7/Run7_isHeldByCurrentThread.java | 2 +-
.../lock/example7/Run7_isLocked.java | 2 +-
.../multithread/lock/example7/Service1.java | 4 +-
.../multithread/lock/example7/Service2.java | 2 +-
.../multithread/lock/example7/Service3.java | 2 +-
.../example8/Run8_lockInterruptibly1.java | 2 +-
.../example8/Run8_lockInterruptibly2.java | 2 +-
.../lock/example8/Run8_tryLock.java | 2 +-
.../lock/example8/Run8_tryLock_param.java | 4 +-
.../multithread/lock/example8/Service1.java | 11 +++--
.../multithread/lock/example8/Service2.java | 10 ++---
.../multithread/lock/example8/Service3.java | 13 +++---
.../multithread/lock/example8/Service4.java | 15 +++----
.../example9/Run9_awaitUniterruptibly1.java | 2 -
.../example9/Run9_awaitUniterruptibly2.java | 2 -
.../multithread/lock/example9/Service.java | 18 ++++----
.../multithread/lock/example9/Service1.java | 4 +-
.../multithread/lock/example9/Service2.java | 4 +-
.../multithread/lock/example9/Thread1.java | 2 +-
.../multithread/lock/example9/Thread2.java | 2 +-
.../multithread/lock/example9/ThreadA.java | 2 +-
.../multithread/lock/example9/ThreadB.java | 2 +-
.../learning/java/multithread/meet/Run.java | 12 +++---
.../multithread/meet/Run10_isInterrupted.java | 4 +-
.../meet/Run11_sleepAndinterrupt01.java | 6 +--
.../meet/Run12_sleepAndinterrupt02.java | 8 ++--
.../meet/Run13_suspendAndresume01.java | 14 +++----
.../meet/Run14_suspendAndresume02.java | 12 +++---
.../meet/Run15_suspendAndresume03.java | 5 +--
.../java/multithread/meet/Run16_yield.java | 6 +--
.../multithread/meet/Run17_priority01.java | 8 ++--
.../multithread/meet/Run18_priority02.java | 25 ++++++-----
.../multithread/meet/Run2_StartVsRun.java | 8 ++--
.../java/multithread/meet/Run3_getName.java | 19 ++++-----
.../java/multithread/meet/Run4_isAlive01.java | 11 +++--
.../java/multithread/meet/Run5_isAlive02.java | 30 ++++++-------
.../multithread/meet/Run6_StartVsRun02.java | 11 +++--
.../multithread/meet/Run7_interrupt01.java | 8 ++--
.../multithread/meet/Run8_interrupted01.java | 11 +++--
.../multithread/meet/Run9_interrupted02.java | 4 +-
.../singleton/example1/MyObject0.java | 5 ++-
.../singleton/example1/MyObject1.java | 7 ++--
.../singleton/example1/MyObject2.java | 7 ++--
.../singleton/example1/Run1_singleton1.java | 1 -
.../singleton/example1/Run1_singleton2.java | 1 -
.../singleton/example1/Thread0.java | 2 +-
.../singleton/example1/Thread1.java | 2 +-
.../singleton/example1/Thread2.java | 2 +-
.../singleton/example2/MyObject1.java | 7 ++--
.../singleton/example2/MyObject2.java | 9 ++--
.../singleton/example2/MyObject3.java | 9 ++--
.../singleton/example2/MyObject4.java | 11 ++---
.../singleton/example2/Run2_singleton1.java | 1 -
.../singleton/example2/Run2_singleton2.java | 1 -
.../singleton/example2/Run2_singleton3.java | 1 -
.../singleton/example2/Run2_singleton4.java | 1 -
.../singleton/example2/Thread1.java | 3 +-
.../singleton/example2/Thread2.java | 3 +-
.../singleton/example2/Thread3.java | 3 +-
.../singleton/example2/Thread4.java | 3 +-
.../singleton/example3/MyObject1.java | 7 ++--
.../singleton/example3/MyObject2.java | 7 ++--
.../singleton/example3/MyObject3.java | 6 +--
.../singleton/example3/MyObject4.java | 7 ++--
.../singleton/example3/MyObject5.java | 11 +++--
.../singleton/example3/Run3_singleton1.java | 1 -
.../singleton/example3/Run3_singleton2.java | 20 +++++----
.../singleton/example3/Run3_singleton3.java | 1 -
.../singleton/example3/Run3_singleton4.java | 1 -
.../singleton/example3/Run3_singleton5.java | 1 -
.../singleton/example3/Thread1.java | 4 +-
.../singleton/example3/Thread3.java | 6 +--
.../singleton/example3/Thread4.java | 6 +--
.../singleton/example3/Thread5.java | 6 +--
.../supplement/example1/MyService.java | 4 +-
.../supplement/example1/Run1_state1.java | 4 +-
.../supplement/example1/Run1_state2.java | 2 +-
.../supplement/example1/Run1_state3.java | 2 +-
.../supplement/example1/Thread1.java | 10 ++---
.../supplement/example1/Thread2.java | 10 ++---
.../supplement/example1/Thread3.java | 2 +-
.../supplement/example2/MyThread.java | 19 ++++-----
.../example2/Run2_autoAddGroup.java | 16 +++----
.../example2/Run2_getGroupParent.java | 8 ++--
.../example2/Run2_groupAddThread.java | 8 ++--
.../Run2_groupAddThreadMoreLevel.java | 8 ++--
.../example2/Run2_threadRunSyn.java | 6 +--
.../supplement/example2/ThreadA.java | 6 +--
.../supplement/example2/ThreadB.java | 6 +--
.../supplement/example3/DateTools1.java | 4 +-
.../supplement/example3/DateTools2.java | 10 ++---
.../supplement/example3/Run3_formatError.java | 12 +++---
.../supplement/example3/Run3_formatOK1.java | 12 +++---
.../supplement/example3/Run3_formatOK2.java | 12 +++---
.../supplement/example3/Thread0.java | 12 +++---
.../supplement/example3/Thread1.java | 16 +++----
.../supplement/example3/Thread2.java | 12 +++---
.../example4/Run4_threadCreateException2.java | 2 +-
.../example4/Run4_threadCreateException3.java | 2 +-
.../supplement/example4/Thread1.java | 2 +-
.../example5/Run5_threadGroup1.java | 8 ++--
.../example5/Run5_threadGroup2.java | 8 ++--
.../supplement/example5/Thread1.java | 6 +--
.../supplement/example5/Thread2.java | 6 +--
.../supplement/example6/MyThread.java | 6 +--
.../ObjectUncaughtExceptionHandler.java | 3 +-
.../example6/Run6_threadExceptionMove1.java | 1 -
.../example6/Run6_threadExceptionMove2.java | 3 +-
.../synchronize/example1/HasLocalNum.java | 9 ++--
.../synchronize/example1/Run1_local.java | 1 -
.../synchronize/example1/ThreadA.java | 5 ++-
.../synchronize/example1/ThreadB.java | 5 ++-
.../Run10_synBlockMoreObjectOneLock.java | 12 +++---
.../example10/Run10_synTwoLock.java | 3 +-
.../synchronize/example10/Service.java | 18 ++++----
.../synchronize/example10/ServiceSub.java | 17 ++++----
.../synchronize/example10/ServiceSub2.java | 14 +++----
.../example11/Run11_StringAndSyn.java | 2 +-
.../example11/Run11_StringAndSyn2.java | 2 +-
.../synchronize/example11/ServiceA.java | 4 +-
.../synchronize/example11/ServiceB.java | 4 +-
.../synchronize/example11/ThreadB.java | 2 +-
.../synchronize/example12/DealThread.java | 16 +++----
.../synchronize/example12/Run12_deadLock.java | 4 +-
.../synchronize/example13/OutClass.java | 14 +++----
.../synchronize/example13/OutClass2.java | 10 ++---
.../synchronize/example13/Run13_inner01.java | 16 ++++---
.../synchronize/example13/Run13_inner02.java | 17 +++++---
.../example14/Run14_setNewStringTwoLock.java | 6 +--
.../synchronize/example14/Service.java | 6 +--
.../synchronize/example15/RunThread.java | 8 ++--
.../synchronize/example15/RunThread2.java | 11 ++---
.../synchronize/example16/MyThread.java | 7 ++--
.../synchronize/example16/Run16_volatile.java | 6 +--
.../example2/HasSelfPrivateNum.java | 9 ++--
.../synchronize/example2/Run2_private01.java | 1 -
.../synchronize/example2/ThreadA.java | 5 ++-
.../synchronize/example2/ThreadB.java | 5 ++-
.../synchronize/example3/MyObject.java | 6 +--
.../synchronize/example3/ThreadA.java | 5 ++-
.../synchronize/example3/ThreadB.java | 5 ++-
.../synchronize/example4/MyObject.java | 12 +++---
.../synchronize/example4/ThreadA.java | 5 ++-
.../synchronize/example4/ThreadB.java | 5 ++-
.../synchronize/example5/Main.java | 5 ++-
.../synchronize/example5/Run5_lockRein.java | 2 +-
.../multithread/synchronize/example5/Sub.java | 8 ++--
.../synchronize/example6/Run6_exception.java | 4 +-
.../synchronize/example6/Service.java | 16 +++----
.../synchronize/example6/ThreadA.java | 2 +-
.../synchronize/example6/ThreadB.java | 2 +-
.../synchronize/example7/Main.java | 6 +--
.../synchronize/example7/MyThread.java | 7 ++--
.../multithread/synchronize/example7/Sub.java | 8 ++--
.../synchronize/example8/MyThreadA.java | 16 +++----
.../synchronize/example8/MyThreadB.java | 16 +++----
.../example8/Run8_synchronized01.java | 11 +++--
.../example8/Run8_synchronized02.java | 10 ++---
.../synchronize/example8/TaskA.java | 6 +--
.../synchronize/example8/TaskB.java | 8 ++--
.../synchronize/example9/MyObject1.java | 6 +--
.../synchronize/example9/MyObject2.java | 10 ++---
.../synchronize/example9/MyThread.java | 4 +-
.../example9/Run9_synchronized01.java | 4 +-
.../Run9_synchronized01_twoObjects.java | 4 +-
.../example9/Run9_synchronized02.java | 2 +-
.../example9/Run9_synchronized03.java | 2 +-
.../synchronize/example9/Service.java | 8 ++--
.../synchronize/example9/Thread1.java | 3 +-
.../synchronize/example9/Thread2.java | 3 +-
.../multithread/timer/example1/MyTask.java | 4 +-
.../timer/example1/Run1_timer1.java | 6 +--
.../timer/example1/Run1_timer2.java | 6 +--
.../timer/example1/Run1_timer3.java | 8 ++--
.../timer/example1/Run1_timer4.java | 14 +++----
.../timer/example1/Run1_timer5.java | 12 +++---
.../multithread/timer/example1/TaskA.java | 6 +--
.../multithread/timer/example1/TaskB.java | 6 +--
.../multithread/timer/example2/MyTask.java | 4 +-
.../timer/example2/Run2_period1.java | 11 ++---
.../timer/example2/Run2_period2.java | 8 ++--
.../timer/example2/Run2_period3.java | 8 ++--
.../multithread/timer/example2/TaskA.java | 6 +--
.../multithread/timer/example3/MyTask.java | 2 +-
.../timer/example3/Run3_cancel1.java | 10 ++---
.../timer/example3/Run3_cancel2.java | 14 +++----
.../timer/example3/Run3_cancel3.java | 10 ++---
.../multithread/timer/example3/TaskA.java | 4 +-
.../multithread/timer/example3/TaskA2.java | 4 +-
.../multithread/timer/example3/TaskB.java | 4 +-
.../multithread/timer/example3/TaskB2.java | 4 +-
.../timer/example4/Run4_schedule1.java | 8 ++--
.../timer/example4/Run4_schedule2.java | 8 ++--
.../timer/example4/Run4_schedule3.java | 8 ++--
.../timer/example4/Run4_schedule4.java | 11 +++--
.../timer/example4/Run4_schedule5.java | 8 ++--
.../timer/example4/Run4_schedule6.java | 11 +++--
.../example4/Run4_scheduleAtFixedRate1.java | 8 ++--
.../example4/Run4_scheduleAtFixedRate2.java | 11 +++--
.../example4/Run4_scheduleAtFixedRate3.java | 8 ++--
.../example4/Run4_scheduleAtFixedRate4.java | 11 +++--
...un4_schedule_vs_scheduleAtFixedRate_1.java | 15 ++++---
...un4_schedule_vs_scheduleAtFixedRate_2.java | 15 ++++---
pom.xml | 2 -
318 files changed, 1065 insertions(+), 1132 deletions(-)
diff --git a/java-base/pom.xml b/java-base/pom.xml
index d8bb048..c6536e9 100644
--- a/java-base/pom.xml
+++ b/java-base/pom.xml
@@ -11,5 +11,4 @@
java-base
-
\ No newline at end of file
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java b/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
index 8983d1e..bea7928 100644
--- a/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
+++ b/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
@@ -6,7 +6,7 @@
public class FatherClass {
private String name;
- public FatherClass(){
+ public FatherClass() {
System.out.println("执行了父类的无参构造方法");
}
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java b/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
index e923ec9..3289afe 100644
--- a/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
+++ b/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
@@ -8,7 +8,7 @@
* 构造方法调用问题
* 子类构造方法会首先默认调用父类的无参构造方法,无论是否显式写了super();
*/
-public class SonClass extends FatherClass{
+public class SonClass extends FatherClass {
public SonClass(String name) {
//super(name);
System.out.println("执行了子类的构造方法SonClass(String name)");
diff --git a/java-multithread/pom.xml b/java-multithread/pom.xml
index ec99a5e..4757ef8 100644
--- a/java-multithread/pom.xml
+++ b/java-multithread/pom.xml
@@ -18,5 +18,4 @@
-
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java
index f78403d..0411280 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java
@@ -1,6 +1,5 @@
package com.brianway.learning.java.multithread.communication.example1;
-
import java.util.ArrayList;
import java.util.List;
@@ -10,10 +9,11 @@
public class MyList {
private List list = new ArrayList();
- public void add(){
+ public void add() {
list.add("brian");
}
- public int size(){
+
+ public int size() {
return list.size();
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java
index cdc5b50..6874adb 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java
@@ -13,7 +13,7 @@
public class Run1_TwoThreadTransData {
public static void main(String[] args) {
MyList service = new MyList();
- ThreadA a =new ThreadA(service);
+ ThreadA a = new ThreadA(service);
a.setName("A");
a.start();
ThreadB b = new ThreadB(service);
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java
index 225099b..9b8819b 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java
@@ -13,9 +13,9 @@ public ThreadA(MyList list) {
@Override
public void run() {
- for(int i = 0;i<10;i++){
+ for (int i = 0; i < 10; i++) {
list.add();
- System.out.println("添加了"+(i+1)+"元素");
+ System.out.println("添加了" + (i + 1) + "元素");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java
index 88b5a10..541dea8 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java
@@ -14,10 +14,10 @@ public ThreadB(MyList list) {
@Override
public void run() {
try {
- while (true){
+ while (true) {
//System.out.println("in b while: "+list.size());
//synchronized ("any"){}
- if(list.size() == 5){
+ if (list.size() == 5) {
System.out.println("达到size了,线程b要退出了");
throw new InterruptedException();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/C_Thread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/C_Thread.java
index c7f4fda..417d213 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/C_Thread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/C_Thread.java
@@ -3,7 +3,7 @@
/**
* Created by Brian on 2016/4/14.
*/
-public class C_Thread extends Thread{
+public class C_Thread extends Thread {
private Consumer c;
public C_Thread(Consumer c) {
@@ -13,7 +13,7 @@ public C_Thread(Consumer c) {
@Override
public void run() {
- while (true){
+ while (true) {
c.popService();
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Consumer.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Consumer.java
index dda8267..c5773d0 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Consumer.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Consumer.java
@@ -11,8 +11,8 @@ public Consumer(MyStack myStack) {
this.myStack = myStack;
}
- public void popService(){
- System.out.println("pop = "+ myStack.pop()+" Consumer的popService方法中打印pop返回值");
+ public void popService() {
+ System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值");
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/MyStack.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/MyStack.java
index d11d328..c70bb38 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/MyStack.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/MyStack.java
@@ -9,31 +9,31 @@
public class MyStack {
private List list = new ArrayList();
- synchronized public void push(){
+ synchronized public void push() {
try {
- while(list.size()== 1){
- System.out.println("push操作中的: "+ Thread.currentThread().getName()+ " 线程呈wait状态");
+ while (list.size() == 1) {
+ System.out.println("push操作中的: " + Thread.currentThread().getName() + " 线程呈wait状态");
this.wait();
}
list.add(Math.random());
this.notify();
- System.out.println("push = " + list.size() );
+ System.out.println("push = " + list.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- synchronized public String pop(){
+ synchronized public String pop() {
String returnValue = "";
try {
- while(list.size() == 0){
- System.out.println("pop操作中的: "+ Thread.currentThread().getName()+ " 线程呈wait状态");
+ while (list.size() == 0) {
+ System.out.println("pop操作中的: " + Thread.currentThread().getName() + " 线程呈wait状态");
this.wait();
}
- returnValue =list.get(0)+ " "+Thread.currentThread().getName() ;
+ returnValue = list.get(0) + " " + Thread.currentThread().getName();
list.remove(0);
this.notify();
- System.out.println("pop = "+ list.size()+" Mystack的pop方法中 线程"+Thread.currentThread().getName());
+ System.out.println("pop = " + list.size() + " Mystack的pop方法中 线程" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/P_Thread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/P_Thread.java
index 8b8aedd..ef0c576 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/P_Thread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/P_Thread.java
@@ -3,7 +3,7 @@
/**
* Created by Brian on 2016/4/14.
*/
-public class P_Thread extends Thread{
+public class P_Thread extends Thread {
private Producer p;
public P_Thread(Producer p) {
@@ -13,7 +13,7 @@ public P_Thread(Producer p) {
@Override
public void run() {
- while (true){
+ while (true) {
p.pushService();
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Producer.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Producer.java
index 48dd927..14e6eb2 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Producer.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Producer.java
@@ -1,17 +1,17 @@
package com.brianway.learning.java.multithread.communication.example10;
-
/**
* Created by Brian on 2016/4/14.
*/
public class Producer {
private MyStack myStack;
- public Producer(MyStack myStack){
+
+ public Producer(MyStack myStack) {
super();
this.myStack = myStack;
}
- public void pushService(){
+ public void pushService() {
myStack.push();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Run10_oneP_manyC.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Run10_oneP_manyC.java
index 89a7586..286da3f 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Run10_oneP_manyC.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Run10_oneP_manyC.java
@@ -10,7 +10,6 @@
*
* while判断解决条件发生改变时没有得到及时的响应,多个呈wait状态的线程被唤醒的问题
* 但会出现新的问题:假死
- *
*/
public class Run10_oneP_manyC {
public static void main(String[] args) {
@@ -20,20 +19,19 @@ public static void main(String[] args) {
P_Thread p_thread = new P_Thread(p);
p_thread.start();
-
int cNum = 5;
Consumer[] consumers = new Consumer[cNum];
C_Thread[] c_threads = new C_Thread[cNum];
- for(int i=0;itl = new ThreadLocal();
+ private static ThreadLocal tl = new ThreadLocal();
- public static SimpleDateFormat getSimpleDateFormat(String datePattern){
+ public static SimpleDateFormat getSimpleDateFormat(String datePattern) {
SimpleDateFormat sdf = null;
sdf = tl.get();
- if(sdf == null){
+ if (sdf == null) {
sdf = new SimpleDateFormat(datePattern);
tl.set(sdf);
}
- return sdf;
+ return sdf;
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java
index bae3e35..d802730 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java
@@ -14,16 +14,16 @@
public class Run3_formatError {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- String []dateStringArray = new String[]{
- "2000-01-01","2000-01-02","2000-01-03","2000-01-04","2000-01-05",
- "2000-01-06","2000-01-07","2000-01-08","2000-01-09","2000-01-10"
+ String[] dateStringArray = new String[] {
+ "2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", "2000-01-05",
+ "2000-01-06", "2000-01-07", "2000-01-08", "2000-01-09", "2000-01-10"
};
Thread0[] threads = new Thread0[10];
- for(int i=0;i<10;i++){
- threads[i] = new Thread0(sdf,dateStringArray[i]);
+ for (int i = 0; i < 10; i++) {
+ threads[i] = new Thread0(sdf, dateStringArray[i]);
}
- for(int i=0;i<10;i++){
+ for (int i = 0; i < 10; i++) {
threads[i].start();
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
index 5cd1b0c..f5469bc 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
@@ -13,16 +13,16 @@
public class Run3_formatOK1 {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- String []dateStringArray = new String[]{
- "2000-01-01","2000-01-02","2000-01-03","2000-01-04","2000-01-05",
- "2000-01-06","2000-01-07","2000-01-08","2000-01-09","2000-01-10"
+ String[] dateStringArray = new String[] {
+ "2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", "2000-01-05",
+ "2000-01-06", "2000-01-07", "2000-01-08", "2000-01-09", "2000-01-10"
};
Thread1[] threads = new Thread1[10];
- for(int i=0;i<10;i++){
- threads[i] = new Thread1(sdf,dateStringArray[i]);
+ for (int i = 0; i < 10; i++) {
+ threads[i] = new Thread1(sdf, dateStringArray[i]);
}
- for(int i=0;i<10;i++){
+ for (int i = 0; i < 10; i++) {
threads[i].start();
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
index 583b86d..756ff1d 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
@@ -13,16 +13,16 @@
public class Run3_formatOK2 {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- String []dateStringArray = new String[]{
- "2000-01-01","2000-01-02","2000-01-03","2000-01-04","2000-01-05",
- "2000-01-06","2000-01-07","2000-01-08","2000-01-09","2000-01-10"
+ String[] dateStringArray = new String[] {
+ "2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", "2000-01-05",
+ "2000-01-06", "2000-01-07", "2000-01-08", "2000-01-09", "2000-01-10"
};
Thread2[] threads = new Thread2[10];
- for(int i=0;i<10;i++){
- threads[i] = new Thread2(sdf,dateStringArray[i]);
+ for (int i = 0; i < 10; i++) {
+ threads[i] = new Thread2(sdf, dateStringArray[i]);
}
- for(int i=0;i<10;i++){
+ for (int i = 0; i < 10; i++) {
threads[i].start();
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread0.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread0.java
index dd91418..0d2e742 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread0.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread0.java
@@ -7,12 +7,12 @@
/**
* Created by Brian on 2016/4/17.
*/
-public class Thread0 extends Thread{
+public class Thread0 extends Thread {
private SimpleDateFormat sdf;
private String dateString;
- public Thread0(SimpleDateFormat sdf,String dateString){
- this.sdf =sdf;
+ public Thread0(SimpleDateFormat sdf, String dateString) {
+ this.sdf = sdf;
this.dateString = dateString;
}
@@ -21,9 +21,9 @@ public void run() {
try {
Date date = sdf.parse(dateString);
String newDateString = sdf.format(date).toString();
- if(!newDateString.equals(dateString)){
- System.out.println("ThreadName = "+ this.getName()
- +"报错了 日期字符串:"+dateString
+ if (!newDateString.equals(dateString)) {
+ System.out.println("ThreadName = " + this.getName()
+ + "报错了 日期字符串:" + dateString
+ " 转换成的日期为" + newDateString);
}
} catch (ParseException e) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread1.java
index acbee5e..0efb3ec 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread1.java
@@ -7,23 +7,23 @@
/**
* Created by Brian on 2016/4/17.
*/
-public class Thread1 extends Thread{
+public class Thread1 extends Thread {
private SimpleDateFormat sdf;
private String dateString;
- public Thread1(SimpleDateFormat sdf, String dateString){
- this.sdf =sdf;
+ public Thread1(SimpleDateFormat sdf, String dateString) {
+ this.sdf = sdf;
this.dateString = dateString;
}
@Override
public void run() {
try {
- Date date = DateTools1.parse("yyyy-MM-dd",dateString);
- String newDateString = DateTools1.format("yyyy-MM-dd",date).toString();
- if(!newDateString.equals(dateString)){
- System.out.println("ThreadName = "+ this.getName()
- +"报错了 日期字符串:"+dateString
+ Date date = DateTools1.parse("yyyy-MM-dd", dateString);
+ String newDateString = DateTools1.format("yyyy-MM-dd", date).toString();
+ if (!newDateString.equals(dateString)) {
+ System.out.println("ThreadName = " + this.getName()
+ + "报错了 日期字符串:" + dateString
+ " 转换成的日期为" + newDateString);
}
} catch (ParseException e) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread2.java
index 1bf15dd..6848937 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread2.java
@@ -7,12 +7,12 @@
/**
* Created by Brian on 2016/4/17.
*/
-public class Thread2 extends Thread{
+public class Thread2 extends Thread {
private SimpleDateFormat sdf;
private String dateString;
- public Thread2(SimpleDateFormat sdf, String dateString){
- this.sdf =sdf;
+ public Thread2(SimpleDateFormat sdf, String dateString) {
+ this.sdf = sdf;
this.dateString = dateString;
}
@@ -21,9 +21,9 @@ public void run() {
try {
Date date = DateTools2.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
String newDateString = DateTools2.getSimpleDateFormat("yyyy-MM-dd").format(date).toString();
- if(!newDateString.equals(dateString)){
- System.out.println("ThreadName = "+ this.getName()
- +"报错了 日期字符串:"+dateString
+ if (!newDateString.equals(dateString)) {
+ System.out.println("ThreadName = " + this.getName()
+ + "报错了 日期字符串:" + dateString
+ " 转换成的日期为" + newDateString);
}
} catch (ParseException e) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java
index f456b0b..6dc8ec0 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java
@@ -14,7 +14,7 @@ public static void main(String[] args) {
t1.setName("thread t1");
t1.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
- System.out.println("线程:"+t.getName()+" 出现了异常:");
+ System.out.println("线程:" + t.getName() + " 出现了异常:");
e.printStackTrace();
}
});
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java
index 5b8895e..d66fdb5 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java
@@ -12,7 +12,7 @@ public class Run4_threadCreateException3 {
public static void main(String[] args) {
Thread1.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
- System.out.println("线程:"+t.getName()+" 出现了异常:");
+ System.out.println("线程:" + t.getName() + " 出现了异常:");
e.printStackTrace();
}
});
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java
index 06e3eb3..540f79b 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java
@@ -3,7 +3,7 @@
/**
* Created by Brian on 2016/4/17.
*/
-public class Thread1 extends Thread{
+public class Thread1 extends Thread {
@Override
public void run() {
String username = null;
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java
index 2d46100..ba87d67 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java
@@ -11,12 +11,12 @@
public class Run5_threadGroup1 {
public static void main(String[] args) {
ThreadGroup group = new ThreadGroup("Brian's group");
- Thread1 []threads = new Thread1[10];
- for(int i =0;ilock2代码顺序执行");
}
}
}
- if(username.equals("b")){
- synchronized (lock2){
+ if (username.equals("b")) {
+ synchronized (lock2) {
try {
System.out.println("username = " + username);
Thread.sleep(2000);
@@ -37,7 +37,7 @@ public void run() {
e.printStackTrace();
}
- synchronized (lock1){
+ synchronized (lock1) {
System.out.println("按lock2->lock1代码顺序执行");
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java
index f4c7eac..7b982cd 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java
@@ -14,11 +14,11 @@ public static void main(String[] args) {
try {
DealThread t1 = new DealThread();
t1.setFlag("a");
- Thread thread1 =new Thread(t1);
+ Thread thread1 = new Thread(t1);
thread1.start();
Thread.sleep(100);
t1.setFlag("b");
- Thread thread2 =new Thread(t1);
+ Thread thread2 = new Thread(t1);
thread2.start();
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass.java
index 05723f3..bfa8da8 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass.java
@@ -4,11 +4,11 @@
* Created by Brian on 2016/4/13.
*/
public class OutClass {
- static class Inner{
+ static class Inner {
public void method1() {
- synchronized ("其他的锁"){
- for (int i=1;i<=10;i++){
- System.out.println(Thread.currentThread().getName()+" i="+ i);
+ synchronized ("其他的锁") {
+ for (int i = 1; i <= 10; i++) {
+ System.out.println(Thread.currentThread().getName() + " i=" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
@@ -18,9 +18,9 @@ public void method1() {
}
}
- public synchronized void method2(){
- for (int i=11;i<=20;i++){
- System.out.println(Thread.currentThread().getName()+" i="+ i);
+ public synchronized void method2() {
+ for (int i = 11; i <= 20; i++) {
+ System.out.println(Thread.currentThread().getName() + " i=" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass2.java
index d5fab6b..27bb7da 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass2.java
@@ -4,8 +4,8 @@
* Created by Brian on 2016/4/13.
*/
public class OutClass2 {
- static class InnerClass1{
- public void method1(InnerClass2 class2){
+ static class InnerClass1 {
+ public void method1(InnerClass2 class2) {
String threadName = Thread.currentThread().getName();
synchronized (class2) {
System.out.println(threadName + " 进入InnerClass1类中的method1方法");
@@ -21,7 +21,7 @@ public void method1(InnerClass2 class2){
}
}
- public synchronized void method2(){
+ public synchronized void method2() {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " 进入InnerClass1类中的method2方法");
@@ -39,8 +39,8 @@ public synchronized void method2(){
}
- static class InnerClass2{
- public synchronized void method1(){
+ static class InnerClass2 {
+ public synchronized void method1() {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " 进入InnerClass2类中的method2方法");
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
index 54a7583..9cbbe15 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
@@ -2,27 +2,31 @@
/**
* Created by Brian on 2016/4/13.
+ *
+ * P112
+ * 内置类和同步测试1
*/
-
/**
* P112
* 内置类和同步测试1
*/
+
import com.brianway.learning.java.multithread.synchronize.example13.OutClass.Inner;
+
public class Run13_inner01 {
public static void main(String[] args) {
final Inner inner = new Inner();
Thread t1 = new Thread(new Runnable() {
- public void run() {
- inner.method1();
- }
- },"A");
+ public void run() {
+ inner.method1();
+ }
+ }, "A");
Thread t2 = new Thread(new Runnable() {
public void run() {
inner.method2();
}
- },"B");
+ }, "B");
t1.start();
t2.start();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
index 86a7189..d2e9630 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
@@ -2,6 +2,12 @@
/**
* Created by Brian on 2016/4/13.
+ *
+ * P112
+ * 内置类与同步测试2
+ *
+ * T1和T3竞争in2的锁。只有T1结束,T3才能开始;或者T3结束,T1才能开始
+ * T2与另外两个没关系,因为其锁对象是in2
*/
/**
@@ -15,7 +21,6 @@
import com.brianway.learning.java.multithread.synchronize.example13.OutClass2.InnerClass1;
import com.brianway.learning.java.multithread.synchronize.example13.OutClass2.InnerClass2;
-
public class Run13_inner02 {
public static void main(String[] args) {
final InnerClass1 in1 = new InnerClass1();
@@ -24,19 +29,19 @@ public static void main(String[] args) {
public void run() {
in1.method1(in2);
}
- },"T1");
+ }, "T1");
- Thread t2 = new Thread(new Runnable() {
+ Thread t2 = new Thread(new Runnable() {
public void run() {
in1.method2();
}
- },"T2");
+ }, "T2");
- Thread t3 = new Thread(new Runnable() {
+ Thread t3 = new Thread(new Runnable() {
public void run() {
in2.method1();
}
- },"T3");
+ }, "T3");
t1.start();
t2.start();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java
index 3a00818..83cd9a7 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java
@@ -9,16 +9,16 @@
* 锁对象改变
*/
public class Run14_setNewStringTwoLock {
- public static void main(String[] args) throws InterruptedException{
+ public static void main(String[] args) throws InterruptedException {
final Service service = new Service();
- Thread a = new Thread(){
+ Thread a = new Thread() {
@Override
public void run() {
service.testMethod();
}
};
a.setName("A");
- Thread b = new Thread(){
+ Thread b = new Thread() {
@Override
public void run() {
service.testMethod();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java
index 092b08b..bfeda5f 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java
@@ -8,11 +8,11 @@ public class Service {
public void testMethod() {
try {
- synchronized (lock){
- System.out.println(Thread.currentThread().getName() + " begin "+ System.currentTimeMillis());
+ synchronized (lock) {
+ System.out.println(Thread.currentThread().getName() + " begin " + System.currentTimeMillis());
lock = "456";
Thread.sleep(2000);
- System.out.println(Thread.currentThread().getName() + " end "+ System.currentTimeMillis());
+ System.out.println(Thread.currentThread().getName() + " end " + System.currentTimeMillis());
}
} catch (InterruptedException e) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java
index 68dc879..48df5b5 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java
@@ -3,11 +3,11 @@
/**
* Created by Brian on 2016/4/13.
*/
-public class RunThread extends Thread{
- private boolean isRunning = true;
+public class RunThread extends Thread {
+ private boolean isRunning = true;
//volatile private boolean isRunning = true;
- public boolean isRunning(){
+ public boolean isRunning() {
return isRunning;
}
@@ -18,7 +18,7 @@ public void setRunning(boolean running) {
@Override
public void run() {
System.out.println("进入run了");
- while(isRunning == true ){
+ while (isRunning == true) {
}
System.out.println("线程被停止了");
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java
index dd016ba..ccf5b68 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java
@@ -3,10 +3,10 @@
/**
* Created by Brian on 2016/4/13.
*/
-public class RunThread2 extends Thread{
- private boolean isRunning = true;
+public class RunThread2 extends Thread {
+ private boolean isRunning = true;
- public boolean isRunning(){
+ public boolean isRunning() {
return isRunning;
}
@@ -17,8 +17,9 @@ public void setRunning(boolean running) {
@Override
public void run() {
System.out.println("进入run了");
- while(isRunning == true ){
- synchronized ("any thing"){}
+ while (isRunning == true) {
+ synchronized ("any thing") {
+ }
}
System.out.println("线程被停止了");
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java
index 1e42949..4adef41 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java
@@ -5,12 +5,13 @@
*/
public class MyThread extends Thread {
volatile public static int count;
+
//synchronized
- private static void addCount(){
- for(int i=0;i<100;i++) {
+ private static void addCount() {
+ for (int i = 0; i < 100; i++) {
count++;
}
- System.out.println("count="+count);
+ System.out.println("count=" + count);
}
@Override
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java
index 4e80260..055d320 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java
@@ -11,10 +11,10 @@
public class Run16_volatile {
public static void main(String[] args) {
MyThread[] myThreads = new MyThread[100];
- for(int i=0;i<100;i++){
- myThreads[i]= new MyThread();
+ for (int i = 0; i < 100; i++) {
+ myThreads[i] = new MyThread();
}
- for(int i=0;i<100;i++){
+ for (int i = 0; i < 100; i++) {
myThreads[i].start();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java
index ee7ce02..c50898a 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java
@@ -5,19 +5,20 @@
*/
public class HasSelfPrivateNum {
private int num = 0;
+
synchronized
- public void addI(String username){
+ public void addI(String username) {
try {
- if(username.equals("a")) {
+ if (username.equals("a")) {
num = 100;
System.out.println("a set over");
Thread.sleep(2000);
- }else{
+ } else {
num = 200;
System.out.println("b set over");
}
- System.out.println(username + " num= "+num);
+ System.out.println(username + " num= " + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java
index acbd1a0..4b56d00 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java
@@ -1,6 +1,5 @@
package com.brianway.learning.java.multithread.synchronize.example2;
-
/**
* Created by Brian on 2016/4/11.
*/
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java
index 2772393..d10c147 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java
@@ -3,9 +3,10 @@
/**
* Created by Brian on 2016/4/11.
*/
-public class ThreadA extends Thread{
+public class ThreadA extends Thread {
private HasSelfPrivateNum numRef;
- public ThreadA(HasSelfPrivateNum numRef){
+
+ public ThreadA(HasSelfPrivateNum numRef) {
super();
this.numRef = numRef;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java
index e35b481..95d69a5 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java
@@ -3,9 +3,10 @@
/**
* Created by Brian on 2016/4/11.
*/
-public class ThreadB extends Thread{
+public class ThreadB extends Thread {
private HasSelfPrivateNum numRef;
- public ThreadB(HasSelfPrivateNum numRef){
+
+ public ThreadB(HasSelfPrivateNum numRef) {
super();
this.numRef = numRef;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java
index 9a3f829..3a9275e 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java
@@ -6,11 +6,11 @@
public class MyObject {
synchronized
- public void methodA(){
+ public void methodA() {
try {
- System.out.println("begin methodA threadName="+Thread.currentThread().getName());
+ System.out.println("begin methodA threadName=" + Thread.currentThread().getName());
Thread.sleep(5000);
- System.out.println(Thread.currentThread().getName()+" end");
+ System.out.println(Thread.currentThread().getName() + " end");
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java
index b6efb1a..0cb786e 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java
@@ -3,9 +3,10 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class ThreadA extends Thread{
+public class ThreadA extends Thread {
private MyObject object;
- public ThreadA(MyObject object){
+
+ public ThreadA(MyObject object) {
super();
this.object = object;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java
index bc2e353..bd32dda 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java
@@ -3,9 +3,10 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class ThreadB extends Thread{
+public class ThreadB extends Thread {
private MyObject object;
- public ThreadB(MyObject object){
+
+ public ThreadB(MyObject object) {
super();
this.object = object;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/MyObject.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/MyObject.java
index 70accb8..09aa105 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/MyObject.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/MyObject.java
@@ -5,22 +5,22 @@
*/
public class MyObject {
- synchronized public void methodA(){
+ synchronized public void methodA() {
try {
- System.out.println("begin methodA threadName="+Thread.currentThread().getName());
+ System.out.println("begin methodA threadName=" + Thread.currentThread().getName());
Thread.sleep(5000);
- System.out.println(Thread.currentThread().getName()+" endTime:"+System.currentTimeMillis());
+ System.out.println(Thread.currentThread().getName() + " endTime:" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized
- public void methodB(){
+ public void methodB() {
try {
- System.out.println("begin methodB threadName="+Thread.currentThread().getName());
+ System.out.println("begin methodB threadName=" + Thread.currentThread().getName());
Thread.sleep(5000);
- System.out.println(Thread.currentThread().getName()+" endTime:"+System.currentTimeMillis());
+ System.out.println(Thread.currentThread().getName() + " endTime:" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java
index e213e58..85c1995 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java
@@ -3,9 +3,10 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class ThreadA extends Thread{
+public class ThreadA extends Thread {
private MyObject object;
- public ThreadA(MyObject object){
+
+ public ThreadA(MyObject object) {
super();
this.object = object;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java
index 61b5860..0e4b447 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java
@@ -3,9 +3,10 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class ThreadB extends Thread{
+public class ThreadB extends Thread {
private MyObject object;
- public ThreadB(MyObject object){
+
+ public ThreadB(MyObject object) {
super();
this.object = object;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java
index 92c851b..48bf667 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java
@@ -5,10 +5,11 @@
*/
public class Main {
protected int i = 10;
- synchronized public void operateIinMain(){
+
+ synchronized public void operateIinMain() {
try {
i--;
- System.out.println("main print i="+i);
+ System.out.println("main print i=" + i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java
index 6565c54..53ceba0 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java
@@ -10,7 +10,7 @@
*/
public class Run5_lockRein {
public static void main(String[] args) {
- Thread t = new Thread(){
+ Thread t = new Thread() {
@Override
public void run() {
Sub sub = new Sub();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java
index 445ed67..a950354 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java
@@ -3,12 +3,12 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class Sub extends Main{
- synchronized public void operateIinSub(){
+public class Sub extends Main {
+ synchronized public void operateIinSub() {
try {
- while (i>0){
+ while (i > 0) {
i--;
- System.out.println("sub print i="+i);
+ System.out.println("sub print i=" + i);
Thread.sleep(100);
this.operateIinMain();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java
index c0b5660..8ca51b0 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java
@@ -13,10 +13,10 @@ public static void main(String[] args) {
try {
Service service = new Service();
- ThreadA a = new ThreadA("a",service);
+ ThreadA a = new ThreadA("a", service);
a.start();
Thread.sleep(500);
- ThreadB b = new ThreadB("b",service);
+ ThreadB b = new ThreadB("b", service);
b.start();
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java
index 77c166a..d33d095 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java
@@ -4,19 +4,19 @@
* Created by Brian on 2016/4/12.
*/
public class Service {
- synchronized public void testMethod(){
- if(Thread.currentThread().getName().equals("a")){
- System.out.println("ThreadName="+ Thread.currentThread().getName()+" run beginTime="+System.currentTimeMillis());
+ synchronized public void testMethod() {
+ if (Thread.currentThread().getName().equals("a")) {
+ System.out.println("ThreadName=" + Thread.currentThread().getName() + " run beginTime=" + System.currentTimeMillis());
int i = 1;
- while(i == 1){
- if((""+Math.random()).substring(0,8).equals("0.123456")){
- System.out.println("ThreadName="+ Thread.currentThread().getName()+" run exceptionTime="+System.currentTimeMillis());
+ while (i == 1) {
+ if (("" + Math.random()).substring(0, 8).equals("0.123456")) {
+ System.out.println("ThreadName=" + Thread.currentThread().getName() + " run exceptionTime=" + System.currentTimeMillis());
Integer.parseInt("a");
}
}
- }else{
- System.out.println("Thread b run Time="+System.currentTimeMillis());
+ } else {
+ System.out.println("Thread b run Time=" + System.currentTimeMillis());
}
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java
index 933a437..d3ecf75 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java
@@ -3,7 +3,7 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class ThreadA extends Thread{
+public class ThreadA extends Thread {
private Service service;
public ThreadA(String name, Service service) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java
index fc4f458..8c5d51e 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java
@@ -3,7 +3,7 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class ThreadB extends Thread{
+public class ThreadB extends Thread {
private Service service;
public ThreadB(String name, Service service) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java
index a0db493..13bd444 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java
@@ -4,11 +4,11 @@
* Created by Brian on 2016/4/12.
*/
public class Main {
- synchronized public void testMethod(){
+ synchronized public void testMethod() {
try {
- System.out.println("threadName= "+Thread.currentThread().getName()+" in main 下一步 sleep begin time ="+System.currentTimeMillis());
+ System.out.println("threadName= " + Thread.currentThread().getName() + " in main 下一步 sleep begin time =" + System.currentTimeMillis());
Thread.sleep(5000);
- System.out.println("threadName= "+Thread.currentThread().getName()+" in main 下一步 sleep end time ="+System.currentTimeMillis());
+ System.out.println("threadName= " + Thread.currentThread().getName() + " in main 下一步 sleep end time =" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java
index 7bb4f1f..a3b3955 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java
@@ -3,11 +3,12 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class MyThread extends Thread{
+public class MyThread extends Thread {
private Sub sub;
- public MyThread(Sub sub){
+
+ public MyThread(Sub sub) {
super();
- this.sub= sub;
+ this.sub = sub;
}
@Override
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java
index 3e9976a..d8f2d9f 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java
@@ -3,13 +3,13 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class Sub extends Main{
+public class Sub extends Main {
//synchronized
- public void testMethod(){
+ public void testMethod() {
try {
- System.out.println("threadName= "+Thread.currentThread().getName()+" in sub 下一步 sleep begin time ="+System.currentTimeMillis());
+ System.out.println("threadName= " + Thread.currentThread().getName() + " in sub 下一步 sleep begin time =" + System.currentTimeMillis());
Thread.sleep(2000);
- System.out.println("threadName= "+Thread.currentThread().getName()+" in sub 下一步 sleep end time ="+System.currentTimeMillis());
+ System.out.println("threadName= " + Thread.currentThread().getName() + " in sub 下一步 sleep end time =" + System.currentTimeMillis());
super.testMethod();
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java
index a9d3edf..2cbbc78 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java
@@ -3,24 +3,26 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class MyThreadA extends Thread{
+public class MyThreadA extends Thread {
private TaskA taskA;
- public MyThreadA(TaskA taskA){
+
+ public MyThreadA(TaskA taskA) {
super();
this.taskA = taskA;
}
+
@Override
public void run() {
super.run();
- if(this.getName().equals("a")){
- CommonUtils.beginTime1= System.currentTimeMillis();
+ if (this.getName().equals("a")) {
+ CommonUtils.beginTime1 = System.currentTimeMillis();
taskA.doLongTimeTask();
CommonUtils.endTime1 = System.currentTimeMillis();
- }else if(this.getName().equals("b")){
- CommonUtils.beginTime2= System.currentTimeMillis();
+ } else if (this.getName().equals("b")) {
+ CommonUtils.beginTime2 = System.currentTimeMillis();
taskA.doLongTimeTask();
CommonUtils.endTime2 = System.currentTimeMillis();
- }else{
+ } else {
System.out.println("unexpected name");
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java
index 4d5ab4d..5f77112 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java
@@ -3,24 +3,26 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class MyThreadB extends Thread{
+public class MyThreadB extends Thread {
private TaskB taskB;
- public MyThreadB(TaskB taskB){
+
+ public MyThreadB(TaskB taskB) {
super();
this.taskB = taskB;
}
+
@Override
public void run() {
super.run();
- if(this.getName().equals("c")){
- CommonUtils.beginTime1= System.currentTimeMillis();
+ if (this.getName().equals("c")) {
+ CommonUtils.beginTime1 = System.currentTimeMillis();
taskB.doLongTimeTask();
CommonUtils.endTime1 = System.currentTimeMillis();
- }else if(this.getName().equals("d")){
- CommonUtils.beginTime2= System.currentTimeMillis();
+ } else if (this.getName().equals("d")) {
+ CommonUtils.beginTime2 = System.currentTimeMillis();
taskB.doLongTimeTask();
CommonUtils.endTime2 = System.currentTimeMillis();
- }else{
+ } else {
System.out.println("unexpected name");
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java
index e810f93..68195e1 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java
@@ -11,11 +11,11 @@
public class Run8_synchronized01 {
public static void main(String[] args) {
TaskA taskA = new TaskA();
- MyThreadA thread1 =new MyThreadA(taskA);
+ MyThreadA thread1 = new MyThreadA(taskA);
thread1.setName("a");
thread1.start();
- MyThreadA thread2 =new MyThreadA(taskA);
+ MyThreadA thread2 = new MyThreadA(taskA);
thread2.setName("b");
thread2.start();
@@ -25,12 +25,11 @@ public static void main(String[] args) {
e.printStackTrace();
}
- long beginTime = CommonUtils.beginTime2CommonUtils.endTime2?CommonUtils.endTime1:CommonUtils.endTime2;
- System.out.println("耗时:"+(endTime-beginTime)/1000);
+ long beginTime = CommonUtils.beginTime2 < CommonUtils.beginTime1 ? CommonUtils.beginTime2 : CommonUtils.beginTime1;
+ long endTime = CommonUtils.endTime1 > CommonUtils.endTime2 ? CommonUtils.endTime1 : CommonUtils.endTime2;
+ System.out.println("耗时:" + (endTime - beginTime) / 1000);
}
-
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
index 2a2a1ba..1e425ca 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
@@ -12,11 +12,11 @@
public class Run8_synchronized02 {
public static void main(String[] args) {
TaskB taskB = new TaskB();
- MyThreadB thread1 =new MyThreadB(taskB);
+ MyThreadB thread1 = new MyThreadB(taskB);
thread1.setName("c");
thread1.start();
- MyThreadB thread2 =new MyThreadB(taskB);
+ MyThreadB thread2 = new MyThreadB(taskB);
thread2.setName("d");
thread2.start();
@@ -26,9 +26,9 @@ public static void main(String[] args) {
e.printStackTrace();
}
- long beginTime = CommonUtils.beginTime2CommonUtils.endTime2?CommonUtils.endTime1:CommonUtils.endTime2;
- System.out.println("耗时:"+(endTime-beginTime)/1000);
+ long beginTime = CommonUtils.beginTime2 < CommonUtils.beginTime1 ? CommonUtils.beginTime2 : CommonUtils.beginTime1;
+ long endTime = CommonUtils.endTime1 > CommonUtils.endTime2 ? CommonUtils.endTime1 : CommonUtils.endTime2;
+ System.out.println("耗时:" + (endTime - beginTime) / 1000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java
index a2fe05f..a2bdead 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java
@@ -7,12 +7,12 @@ public class TaskA {
private String getData1;
private String getData2;
- public synchronized void doLongTimeTask(){
+ public synchronized void doLongTimeTask() {
try {
System.out.println("begin task");
Thread.sleep(3000);
- getData1 = "长时间处理任务后从远程返回的值1 threadName="+Thread.currentThread().getName();
- getData2 = "长时间处理任务后从远程返回的值2 threadName="+Thread.currentThread().getName();
+ getData1 = "长时间处理任务后从远程返回的值1 threadName=" + Thread.currentThread().getName();
+ getData2 = "长时间处理任务后从远程返回的值2 threadName=" + Thread.currentThread().getName();
System.out.println(getData1);
System.out.println(getData2);
System.out.println("end task");
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskB.java
index 0bc640b..5cfc9b4 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskB.java
@@ -7,13 +7,13 @@ public class TaskB {
private String getData1;
private String getData2;
- public void doLongTimeTask(){
+ public void doLongTimeTask() {
try {
System.out.println("begin task");
Thread.sleep(3000);
- String privateGetData1 = "长时间处理任务后从远程返回的值1 threadName="+Thread.currentThread().getName();
- String privateGetData2 = "长时间处理任务后从远程返回的值2 threadName="+Thread.currentThread().getName();
- synchronized (this){
+ String privateGetData1 = "长时间处理任务后从远程返回的值1 threadName=" + Thread.currentThread().getName();
+ String privateGetData2 = "长时间处理任务后从远程返回的值2 threadName=" + Thread.currentThread().getName();
+ synchronized (this) {
//System.out.println("切换到线程begin:"+Thread.currentThread().getName());
getData1 = privateGetData1;
getData2 = privateGetData2;
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java
index b308bed..c30a6c3 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java
@@ -4,9 +4,9 @@
* Created by Brian on 2016/4/12.
*/
public class MyObject1 extends MyObject {
- synchronized public void speedPrintString(){
- System.out.println("speedPrintString ____getLock time="+System.currentTimeMillis()+ " run ThreadName="+Thread.currentThread().getName());
+ synchronized public void speedPrintString() {
+ System.out.println("speedPrintString ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
System.out.println("*******************");
- System.out.println("speedPrintString releaseLock time="+System.currentTimeMillis()+ " run ThreadName="+Thread.currentThread().getName());
+ System.out.println("speedPrintString releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java
index d9474f4..c73a380 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java
@@ -3,12 +3,12 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class MyObject2 extends MyObject{
- public void speedPrintString(){
- synchronized (this){
- System.out.println("speedPrintString ____getLock time="+System.currentTimeMillis()+ " run ThreadName="+Thread.currentThread().getName());
+public class MyObject2 extends MyObject {
+ public void speedPrintString() {
+ synchronized (this) {
+ System.out.println("speedPrintString ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
System.out.println("*******************");
- System.out.println("speedPrintString releaseLock time="+System.currentTimeMillis()+ " run ThreadName="+Thread.currentThread().getName());
+ System.out.println("speedPrintString releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
}
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java
index bd3cb2f..989e92a 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java
@@ -3,11 +3,11 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class MyThread extends Thread{
+public class MyThread extends Thread {
private Service service;
private MyObject object;
- public MyThread(Service service,MyObject object) {
+ public MyThread(Service service, MyObject object) {
super();
this.object = object;
this.service = service;
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
index 89cb151..1d5cbfe 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
@@ -18,10 +18,10 @@ public static void main(String[] args) {
Service service = new Service();
MyObject object = new MyObject();
- MyThread a = new MyThread(service,object);
+ MyThread a = new MyThread(service, object);
a.setName("a");
a.start();
- MyThread b = new MyThread(service,object);
+ MyThread b = new MyThread(service, object);
b.setName("b");
b.start();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java
index 4c5ccf5..98d311b 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java
@@ -14,10 +14,10 @@ public static void main(String[] args) {
MyObject object1 = new MyObject();
MyObject object2 = new MyObject();
- MyThread a = new MyThread(service,object1);
+ MyThread a = new MyThread(service, object1);
a.setName("a");
a.start();
- MyThread b = new MyThread(service,object2);
+ MyThread b = new MyThread(service, object2);
b.setName("b");
b.start();
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
index deef8bb..b1700a1 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
@@ -18,7 +18,7 @@ public static void main(String[] args) {
Service service = new Service();
MyObject1 object1 = new MyObject1();
- MyThread a = new MyThread(service,object1);
+ MyThread a = new MyThread(service, object1);
a.setName("a");
a.start();
Thread1 b = new Thread1(object1);
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
index 4656f88..805f049 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
@@ -19,7 +19,7 @@ public static void main(String[] args) {
Service service = new Service();
MyObject2 object2 = new MyObject2();
- MyThread a = new MyThread(service,object2);
+ MyThread a = new MyThread(service, object2);
a.setName("a");
a.start();
Thread2 b = new Thread2(object2);
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java
index d021668..507a336 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java
@@ -4,12 +4,12 @@
* Created by Brian on 2016/4/12.
*/
public class Service {
- public void testMethod1(MyObject object){
- synchronized (object){
+ public void testMethod1(MyObject object) {
+ synchronized (object) {
try {
- System.out.println("testMethod1 ____getLock time="+System.currentTimeMillis()+ " run ThreadName="+Thread.currentThread().getName());
+ System.out.println("testMethod1 ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
Thread.sleep(2000);
- System.out.println("testMethod1 releaseLock time="+System.currentTimeMillis()+ " run ThreadName="+Thread.currentThread().getName());
+ System.out.println("testMethod1 releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java
index c0a2eb2..bc4be32 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java
@@ -3,10 +3,9 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class Thread1 extends Thread{
+public class Thread1 extends Thread {
private MyObject1 object1;
-
public Thread1(MyObject1 object1) {
this.object1 = object1;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java
index 31ef386..34855b4 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java
@@ -3,10 +3,9 @@
/**
* Created by Brian on 2016/4/12.
*/
-public class Thread2 extends Thread{
+public class Thread2 extends Thread {
private MyObject2 object2;
-
public Thread2(MyObject2 object2) {
this.object2 = object2;
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java
index ecb1791..12c783c 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java
@@ -6,9 +6,9 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class MyTask extends TimerTask{
+public class MyTask extends TimerTask {
@Override
public void run() {
- System.out.println("任务执行了,时间为:"+new Date());
+ System.out.println("任务执行了,时间为:" + new Date());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java
index 401fa4a..e269b2f 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java
@@ -15,14 +15,14 @@
*/
public class Run1_timer1 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.SECOND,5);
+ calendar.add(Calendar.SECOND, 5);
Date runDate = calendar.getTime();
MyTask task = new MyTask();
Timer timer = new Timer();
- timer.schedule(task,runDate);
+ timer.schedule(task, runDate);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java
index 16e1e5a..8f77089 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java
@@ -16,14 +16,14 @@
*/
public class Run1_timer2 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.SECOND,5);
+ calendar.add(Calendar.SECOND, 5);
Date runDate = calendar.getTime();
MyTask task = new MyTask();
Timer timer = new Timer(true);//守护线程
- timer.schedule(task,runDate);
+ timer.schedule(task, runDate);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java
index 0ff33f2..5163053 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java
@@ -14,14 +14,14 @@
*/
public class Run1_timer3 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-10);
+ calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 10);
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
MyTask task = new MyTask();
Timer timer = new Timer();
- timer.schedule(task,runDate);
+ timer.schedule(task, runDate);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java
index ae23c25..a686757 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java
@@ -14,22 +14,22 @@
*/
public class Run1_timer4 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.SECOND,5);
+ calendar.add(Calendar.SECOND, 5);
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
Calendar calendar2 = Calendar.getInstance();
- calendar.add(Calendar.SECOND,10);
+ calendar.add(Calendar.SECOND, 10);
Date runDate2 = calendar2.getTime();
- System.out.println("计划时间为:"+ runDate2);
+ System.out.println("计划时间为:" + runDate2);
MyTask task1 = new MyTask();
MyTask task2 = new MyTask();
Timer timer = new Timer();
- timer.schedule(task1,runDate);
- timer.schedule(task2,runDate);
+ timer.schedule(task1, runDate);
+ timer.schedule(task2, runDate);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java
index 8ce959a..ff7c9bc 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java
@@ -15,21 +15,21 @@
*/
public class Run1_timer5 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
- System.out.println("A计划时间为:"+ runDate);
+ System.out.println("A计划时间为:" + runDate);
Calendar calendar2 = Calendar.getInstance();
- calendar2.add(Calendar.SECOND,5);
+ calendar2.add(Calendar.SECOND, 5);
Date runDate2 = calendar2.getTime();
- System.out.println("B计划时间为:"+ runDate2);
+ System.out.println("B计划时间为:" + runDate2);
TaskA task1 = new TaskA();
TaskB task2 = new TaskB();
Timer timer = new Timer();
- timer.schedule(task1,runDate);
- timer.schedule(task2,runDate);
+ timer.schedule(task1, runDate);
+ timer.schedule(task2, runDate);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java
index 9030040..9b142f8 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java
@@ -6,13 +6,13 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class TaskA extends TimerTask{
+public class TaskA extends TimerTask {
@Override
public void run() {
try {
- System.out.println("A begin timer="+new Date());
+ System.out.println("A begin timer=" + new Date());
Thread.sleep(10000);
- System.out.println("A end timer="+new Date());
+ System.out.println("A end timer=" + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java
index adb0bd0..6997f42 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java
@@ -6,10 +6,10 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class TaskB extends TimerTask{
+public class TaskB extends TimerTask {
@Override
public void run() {
- System.out.println("B begin timer="+new Date());
- System.out.println("B end timer="+new Date());
+ System.out.println("B begin timer=" + new Date());
+ System.out.println("B end timer=" + new Date());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java
index 7c2a555..c087214 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java
@@ -6,9 +6,9 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class MyTask extends TimerTask{
+public class MyTask extends TimerTask {
@Override
public void run() {
- System.out.println("任务执行了,时间为:"+new Date());
+ System.out.println("任务执行了,时间为:" + new Date());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java
index 1c50401..a348ba9 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java
@@ -1,8 +1,5 @@
package com.brianway.learning.java.multithread.timer.example2;
-import com.brianway.learning.java.multithread.timer.example1.TaskA;
-import com.brianway.learning.java.multithread.timer.example1.TaskB;
-
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
@@ -17,15 +14,15 @@
*/
public class Run2_period1 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.SECOND,10);
+ calendar.add(Calendar.SECOND, 10);
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
MyTask task = new MyTask();
Timer timer = new Timer();
- timer.schedule(task,runDate,4000);
+ timer.schedule(task, runDate, 4000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java
index 5ac84d4..64c6ea4 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java
@@ -14,15 +14,15 @@
*/
public class Run2_period2 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-10);
+ calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 10);
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
MyTask task = new MyTask();
Timer timer = new Timer();
- timer.schedule(task,runDate,4000);
+ timer.schedule(task, runDate, 4000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java
index 3f91fe4..a4fb9b0 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java
@@ -14,15 +14,15 @@
*/
public class Run2_period3 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.SECOND,10);
+ calendar.add(Calendar.SECOND, 10);
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
TaskA task = new TaskA();
Timer timer = new Timer();
- timer.schedule(task,runDate,3000);
+ timer.schedule(task, runDate, 3000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java
index 01373f6..bc5d902 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java
@@ -6,13 +6,13 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class TaskA extends TimerTask{
+public class TaskA extends TimerTask {
@Override
public void run() {
try {
- System.out.println("A begin timer="+new Date());
+ System.out.println("A begin timer=" + new Date());
Thread.sleep(5000);
- System.out.println("A end timer="+new Date());
+ System.out.println("A end timer=" + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java
index a8e7202..d539ada 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java
@@ -14,6 +14,6 @@ public MyTask(int i) {
@Override
public void run() {
- System.out.println("第"+i+"次没有被cancel取消");
+ System.out.println("第" + i + "次没有被cancel取消");
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java
index d8128be..b6b75d9 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java
@@ -15,16 +15,16 @@
*/
public class Run3_cancel1 {
public static void main(String[] args) {
- System.out.println("当前时间为:"+new Date());
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
TaskA task1 = new TaskA();
- TaskB task2 =new TaskB();
+ TaskB task2 = new TaskB();
Timer timer = new Timer();
- timer.schedule(task1,runDate,4000);
- timer.schedule(task2,runDate,4000);
+ timer.schedule(task1, runDate, 4000);
+ timer.schedule(task2, runDate, 4000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java
index cb9cb53..466be39 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java
@@ -4,8 +4,6 @@
import java.util.Date;
import java.util.Timer;
-
-
/**
* Created by Brian on 2016/4/15.
*/
@@ -16,17 +14,17 @@
* 全部任务被清除,且进程被销毁
*/
public class Run3_cancel2 {
- public static void main(String[] args) throws InterruptedException{
- System.out.println("当前时间为:"+new Date());
+ public static void main(String[] args) throws InterruptedException {
+ System.out.println("当前时间为:" + new Date());
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
- System.out.println("计划时间为:"+ runDate);
+ System.out.println("计划时间为:" + runDate);
TaskA2 task1 = new TaskA2();
- TaskB2 task2 =new TaskB2();
+ TaskB2 task2 = new TaskB2();
Timer timer = new Timer();
- timer.schedule(task1,runDate,2000);
- timer.schedule(task2,runDate,2000);
+ timer.schedule(task1, runDate, 2000);
+ timer.schedule(task2, runDate, 2000);
Thread.sleep(10000);
timer.cancel();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java
index c79febc..df103e1 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java
@@ -4,8 +4,6 @@
import java.util.Date;
import java.util.Timer;
-
-
/**
* Created by Brian on 2016/4/15.
*/
@@ -16,16 +14,16 @@
* 有时不一定会停止计划任务,(见源码,queue锁)
*/
public class Run3_cancel3 {
- public static void main(String[] args) throws InterruptedException{
- int i =0;
+ public static void main(String[] args) throws InterruptedException {
+ int i = 0;
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
- while (true){
+ while (true) {
i++;
Timer timer = new Timer();
MyTask task = new MyTask(i);
- timer.schedule(task,runDate);
+ timer.schedule(task, runDate);
timer.cancel();
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java
index e173713..f93c6bb 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java
@@ -6,10 +6,10 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class TaskA extends TimerTask{
+public class TaskA extends TimerTask {
@Override
public void run() {
- System.out.println("A run timer="+new Date());
+ System.out.println("A run timer=" + new Date());
this.cancel();
System.out.println("A任务自己移除自己");
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java
index c452727..430deed 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java
@@ -6,9 +6,9 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class TaskA2 extends TimerTask{
+public class TaskA2 extends TimerTask {
@Override
public void run() {
- System.out.println("A run timer="+new Date());
+ System.out.println("A run timer=" + new Date());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java
index 5c63c45..996dbb5 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java
@@ -6,9 +6,9 @@
/**
* Created by brian on 2016/4/15.
*/
-public class TaskB extends TimerTask{
+public class TaskB extends TimerTask {
@Override
public void run() {
- System.out.println("B run timer="+new Date());
+ System.out.println("B run timer=" + new Date());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java
index dcb96ac..63ad2aa 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java
@@ -6,9 +6,9 @@
/**
* Created by Brian on 2016/4/15.
*/
-public class TaskB2 extends TimerTask{
+public class TaskB2 extends TimerTask {
@Override
public void run() {
- System.out.println("B run timer="+new Date());
+ System.out.println("B run timer=" + new Date());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java
index 47b22c9..feeeca8 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java
@@ -13,18 +13,18 @@
* schedule(TimerTask task, long delay)方法
*/
public class Run4_schedule1 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
- System.out.println("运行了!时间为:"+new Date());
+ System.out.println("运行了!时间为:" + new Date());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
Timer timer = new Timer();
- System.out.println("当前时间:"+new Date());
- timer.schedule(task,7000);
+ System.out.println("当前时间:" + new Date());
+ timer.schedule(task, 7000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java
index e82c4c1..a841364 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java
@@ -13,18 +13,18 @@
* schedule(TimerTask task, long delay, long period)方法
*/
public class Run4_schedule2 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
- System.out.println("运行了!时间为:"+new Date());
+ System.out.println("运行了!时间为:" + new Date());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
Timer timer = new Timer();
- System.out.println("当前时间:"+new Date());
- timer.schedule(task,2000,1000);
+ System.out.println("当前时间:" + new Date());
+ timer.schedule(task, 2000, 1000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java
index 3fab0bc..337e598 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java
@@ -16,13 +16,13 @@
* 不延时的情况下,若执行任务未被延时,下次执行任务的开始时间是上一次任务的开始时间加上period
*/
public class Run4_schedule3 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(1000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -34,7 +34,7 @@ public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
Timer timer = new Timer();
- timer.schedule(task,runDate,3000);
+ timer.schedule(task, runDate, 3000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java
index 15a09b5..2ea64c9 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java
@@ -4,7 +4,6 @@
* Created by brian on 2016/4/15.
*/
-
import java.util.Timer;
import java.util.TimerTask;
@@ -15,13 +14,13 @@
* 不延时的情况下,若执行任务未被延时,第一次执行是任务开始+delay,下次执行任务的开始时间是上一次任务的开始时间加上period
*/
public class Run4_schedule4 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(1000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -30,9 +29,9 @@ public void run() {
public static void main(String[] args) {
MyTask task = new MyTask();
- System.out.println("当前时间:"+System.currentTimeMillis());
+ System.out.println("当前时间:" + System.currentTimeMillis());
Timer timer = new Timer();
- timer.schedule(task,3000,4000);
+ timer.schedule(task, 3000, 4000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java
index b6e3aa8..a01c942 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java
@@ -16,13 +16,13 @@
* 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
*/
public class Run4_schedule5 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(5000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -34,7 +34,7 @@ public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
Timer timer = new Timer();
- timer.schedule(task,runDate,2000);
+ timer.schedule(task, runDate, 2000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java
index b8532f9..6414872 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java
@@ -4,7 +4,6 @@
* Created by brian on 2016/4/15.
*/
-
import java.util.Timer;
import java.util.TimerTask;
@@ -15,13 +14,13 @@
* 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
*/
public class Run4_schedule6 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(5000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -30,9 +29,9 @@ public void run() {
public static void main(String[] args) {
MyTask task = new MyTask();
- System.out.println("当前时间:"+System.currentTimeMillis());
+ System.out.println("当前时间:" + System.currentTimeMillis());
Timer timer = new Timer();
- timer.schedule(task,3000,2000);
+ timer.schedule(task, 3000, 2000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java
index fed27c7..1dac553 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java
@@ -16,13 +16,13 @@
* 不延时的情况下,若执行任务未被延时,下次执行任务的开始时间是上一次任务的开始时间加上period
*/
public class Run4_scheduleAtFixedRate1 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(1000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -34,7 +34,7 @@ public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
Timer timer = new Timer();
- timer.scheduleAtFixedRate(task,runDate,3000);
+ timer.scheduleAtFixedRate(task, runDate, 3000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java
index a27f004..8b1ba32 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java
@@ -4,7 +4,6 @@
* Created by brian on 2016/4/15.
*/
-
import java.util.Timer;
import java.util.TimerTask;
@@ -15,13 +14,13 @@
* 不延时的情况下,若执行任务未被延时,第一次执行是任务开始+delay,下次执行任务的开始时间是上一次任务的开始时间加上period
*/
public class Run4_scheduleAtFixedRate2 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(1000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -30,9 +29,9 @@ public void run() {
public static void main(String[] args) {
MyTask task = new MyTask();
- System.out.println("当前时间:"+System.currentTimeMillis());
+ System.out.println("当前时间:" + System.currentTimeMillis());
Timer timer = new Timer();
- timer.scheduleAtFixedRate(task,3000,4000);
+ timer.scheduleAtFixedRate(task, 3000, 4000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java
index 9ad09a8..b01be92 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java
@@ -16,13 +16,13 @@
* 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
*/
public class Run4_scheduleAtFixedRate3 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(5000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -34,7 +34,7 @@ public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date runDate = calendar.getTime();
Timer timer = new Timer();
- timer.scheduleAtFixedRate(task,runDate,2000);
+ timer.scheduleAtFixedRate(task, runDate, 2000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java
index 22d711b..d525115 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java
@@ -4,7 +4,6 @@
* Created by brian on 2016/4/15.
*/
-
import java.util.Timer;
import java.util.TimerTask;
@@ -15,13 +14,13 @@
* 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
*/
public class Run4_scheduleAtFixedRate4 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
try {
- System.out.println("begin timer="+ System.currentTimeMillis());
+ System.out.println("begin timer=" + System.currentTimeMillis());
Thread.sleep(5000);
- System.out.println("end timer="+ System.currentTimeMillis());
+ System.out.println("end timer=" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -30,9 +29,9 @@ public void run() {
public static void main(String[] args) {
MyTask task = new MyTask();
- System.out.println("当前时间:"+System.currentTimeMillis());
+ System.out.println("当前时间:" + System.currentTimeMillis());
Timer timer = new Timer();
- timer.scheduleAtFixedRate(task,3000,2000);
+ timer.scheduleAtFixedRate(task, 3000, 2000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java
index b1f089b..2bf97ad 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java
@@ -4,7 +4,6 @@
* Created by brian on 2016/4/15.
*/
-
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
@@ -15,23 +14,23 @@
* schedule不具有追赶执行性
*/
public class Run4_schedule_vs_scheduleAtFixedRate_1 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
- System.out.println("begin timer="+new Date());
- System.out.println("end timer="+new Date());
+ System.out.println("begin timer=" + new Date());
+ System.out.println("end timer=" + new Date());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
- System.out.println("现在执行时间:"+new Date());
+ System.out.println("现在执行时间:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-20);
+ calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 20);
Date runDate = calendar.getTime();
- System.out.println("计划执行时间:"+ runDate);
+ System.out.println("计划执行时间:" + runDate);
Timer timer = new Timer();
- timer.schedule(task,runDate,2000);
+ timer.schedule(task, runDate, 2000);
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java
index 4d34a74..a493c8a 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java
@@ -4,7 +4,6 @@
* Created by brian on 2016/4/15.
*/
-
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
@@ -15,23 +14,23 @@
* scheduleAtFixedRate具有追赶执行性
*/
public class Run4_schedule_vs_scheduleAtFixedRate_2 {
- static public class MyTask extends TimerTask{
+ static public class MyTask extends TimerTask {
@Override
public void run() {
- System.out.println("begin timer="+new Date());
- System.out.println("end timer="+new Date());
+ System.out.println("begin timer=" + new Date());
+ System.out.println("end timer=" + new Date());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
- System.out.println("现在执行时间:"+new Date());
+ System.out.println("现在执行时间:" + new Date());
Calendar calendar = Calendar.getInstance();
- calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-20);
+ calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 20);
Date runDate = calendar.getTime();
- System.out.println("计划执行时间:"+ runDate);
+ System.out.println("计划执行时间:" + runDate);
Timer timer = new Timer();
- timer.scheduleAtFixedRate(task,runDate,2000);
+ timer.scheduleAtFixedRate(task, runDate, 2000);
}
}
diff --git a/pom.xml b/pom.xml
index 0ec62fb..9c68e4b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,6 +59,4 @@
-
-
\ No newline at end of file
From b508f6382f036365d74b51ed37efe74a887c0757 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 21 Aug 2016 19:14:09 +0800
Subject: [PATCH 02/62] [add] add README for mutithread module
---
README.md | 5 ++++-
java-multithread/README.md | 29 +++++++++++++++++++++++++++++
2 files changed, 33 insertions(+), 1 deletion(-)
create mode 100644 java-multithread/README.md
diff --git a/README.md b/README.md
index bc9c13f..64147e0 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,8 @@
# 仓库目录
+**点击相应的模块能看到每个目录的说明文档**
+
- [blogs](/blogs):博客文档
- [java-base](/java-base):java基础巩固模块的java源码
- [java-multithread](/java-multithread):多线程模块的java源码
@@ -57,7 +59,7 @@
* [x] 整理成maven的结构,使用聚合和继承特性(2016.4.12完成)
* [ ] 原有的javase部分代码重构为java-base模块,并逐步上传代码
-* [ ] 多线程部分使用java-multithread模块(进行中)
+* [x] 多线程部分使用java-multithread模块(2016.4.17完成)
* [ ] 集合类部分使用模块java-collection
* [ ] IO部分使用模块java-io
@@ -71,6 +73,7 @@
- [oschina](http://my.oschina.net/brianway)
- [CSDN](http://blog.csdn.net/h3243212/)
+邮箱: weichuyang@163.com
-----
diff --git a/java-multithread/README.md b/java-multithread/README.md
new file mode 100644
index 0000000..31185f7
--- /dev/null
+++ b/java-multithread/README.md
@@ -0,0 +1,29 @@
+# 多线程模块
+
+知识点的文字梳理请参考这篇文章:[java多线程核心技术梳理](http://blog.csdn.net/h3243212/article/details/51180173)
+
+下面对该模块的几个部分作说明:
+
+## meet
+
+该部分是一些简单的基础知识的展示
+
+- [printMain.java](src/main/java/com/brianway/learning/java/multithread/meet/printMain.java):打印当前线程名称
+- [Run.java](src/main/java/com/brianway/learning/java/multithread/meet/Run.java):非线程安全的数据共享
+- [Run2_StartVsRun.java](src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java):run()和start()的区别
+- [Run3_getName.java](src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java):this.getName()!=Thread.currentThread().getName(),这是两个概念
+- [Run4_isAlive01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java):isAlive()
+- [Run5_isAlive02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java):isAlive()
+- [Run6_StartVsRun02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java):run()同步执行,start()异步执行
+- [Run7_interrupt01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java):停止线程
+- [Run8_interrupted01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run8_interrupted01.java):判断线程是否停止状态,测试当前线程是否已经中断
+- [Run9_interrupted02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java):线程的中断状态由interrupted()清除
+- [Run10_isInterrupted.java](src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java):isInterrupted(),不清除状态标记
+- [Run11_sleepAndinterrupt01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java):睡眠中停止,先进入的sleep,再interrupt()
+- [Run12_sleepAndinterrupt02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java):先interrupt(),再进入sleep(),直接进异常
+- [Run13_suspendAndresume01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java):暂停线程,suspend()与resume()
+- [Run14_suspendAndresume02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java):suspend()与resume()的缺点:独占
+- [Run15_suspendAndresume03.java](src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java):suspend()独占锁问题,println()
+- [Run16_yield.java](src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java):测试yield()
+- [Run17_priority01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run17_priority01.java):线程优先级的继承性
+- [Run18_priority02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run18_priority02.java):优先级具有规则性
From 5a757be06458befdc95ece32dd22ac3c15f90c33 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 21 Aug 2016 20:04:17 +0800
Subject: [PATCH 03/62] [update] update README of mutithread, correct some
spell mistakes of synchronized package
---
java-multithread/README.md | 73 +++++++++++++++----
.../Run10_synBlockMoreObjectOneLock.java | 2 +-
.../synchronize/example13/Run13_inner01.java | 6 --
.../example15/Run15_synchronized.java | 2 +-
.../example3/Run3_synchronized01.java | 12 +--
.../example8/Run8_synchronized02.java | 2 +-
.../example9/Run9_synchronized01.java | 2 +-
.../example9/Run9_synchronized02.java | 2 +-
.../example9/Run9_synchronized03.java | 2 +-
9 files changed, 71 insertions(+), 32 deletions(-)
diff --git a/java-multithread/README.md b/java-multithread/README.md
index 31185f7..8b5b41f 100644
--- a/java-multithread/README.md
+++ b/java-multithread/README.md
@@ -2,7 +2,7 @@
知识点的文字梳理请参考这篇文章:[java多线程核心技术梳理](http://blog.csdn.net/h3243212/article/details/51180173)
-下面对该模块的几个部分作说明:
+下面对该模块的几个包作说明:
## meet
@@ -10,20 +10,65 @@
- [printMain.java](src/main/java/com/brianway/learning/java/multithread/meet/printMain.java):打印当前线程名称
- [Run.java](src/main/java/com/brianway/learning/java/multithread/meet/Run.java):非线程安全的数据共享
-- [Run2_StartVsRun.java](src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java):run()和start()的区别
-- [Run3_getName.java](src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java):this.getName()!=Thread.currentThread().getName(),这是两个概念
-- [Run4_isAlive01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java):isAlive()
-- [Run5_isAlive02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java):isAlive()
-- [Run6_StartVsRun02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java):run()同步执行,start()异步执行
+- [Run2_StartVsRun.java](src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java):`run()` 和 `start()` 的区别
+- [Run3_getName.java](src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java):`this.getName()!=Thread.currentThread().getName()`,这是两个概念
+- [Run4_isAlive01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java):`isAlive()`
+- [Run5_isAlive02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java):`isAlive()`
+- [Run6_StartVsRun02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java):`run()` 同步执行,`start()` 异步执行
- [Run7_interrupt01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java):停止线程
- [Run8_interrupted01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run8_interrupted01.java):判断线程是否停止状态,测试当前线程是否已经中断
-- [Run9_interrupted02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java):线程的中断状态由interrupted()清除
-- [Run10_isInterrupted.java](src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java):isInterrupted(),不清除状态标记
-- [Run11_sleepAndinterrupt01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java):睡眠中停止,先进入的sleep,再interrupt()
-- [Run12_sleepAndinterrupt02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java):先interrupt(),再进入sleep(),直接进异常
-- [Run13_suspendAndresume01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java):暂停线程,suspend()与resume()
-- [Run14_suspendAndresume02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java):suspend()与resume()的缺点:独占
-- [Run15_suspendAndresume03.java](src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java):suspend()独占锁问题,println()
-- [Run16_yield.java](src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java):测试yield()
+- [Run9_interrupted02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java):线程的中断状态由 `interrupted()` 清除
+- [Run10_isInterrupted.java](src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java):`isInterrupted()`,不清除状态标记
+- [Run11_sleepAndinterrupt01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java):睡眠中停止,先进入的 `sleep()`,再 `interrupt()`
+- [Run12_sleepAndinterrupt02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java):先 `interrupt()`,再进入 `sleep()`,直接进异常
+- [Run13_suspendAndresume01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java):暂停线程,`suspend()` 与 `resume()`
+- [Run14_suspendAndresume02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java):`suspend()` 与 `resume()` 的缺点:独占
+- [Run15_suspendAndresume03.java](src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java):`suspend()` 独占锁问题,`println()`
+- [Run16_yield.java](src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java):测试 `yield()`
- [Run17_priority01.java](src/main/java/com/brianway/learning/java/multithread/meet/Run17_priority01.java):线程优先级的继承性
- [Run18_priority02.java](src/main/java/com/brianway/learning/java/multithread/meet/Run18_priority02.java):优先级具有规则性
+
+## synchronize
+
+- [example1](src/main/java/com/brianway/learning/java/multithread/synchronize/example1)
+ - [Run1_local.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example1/Run1_local.java):方法内局部变量则不存在“非线程安全”问题
+- [example2](src/main/java/com/brianway/learning/java/multithread/synchronize/example2)
+ - [Run2_private01.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java):实例变量非线程安全
+ - [Run2_twoObject.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java):多个对象多个锁
+- [example3](src/main/java/com/brianway/learning/java/multithread/synchronize/example3)
+ - [Run3_synchronized01.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java):`synchronized` 方法与锁对象
+- [example4](src/main/java/com/brianway/learning/java/multithread/synchronize/example4)
+ - [Run4_synchronized01.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example4/Run4_synchronized01.java):两个线程访问同一个对象的不同方法,线程 B 可异步调用非 `synchronized` 类型方法
+- [example5](src/main/java/com/brianway/learning/java/multithread/synchronize/example5)
+ - [Run5_lockRein.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java):`synchronized` 锁重入,支持继承
+- [example6](src/main/java/com/brianway/learning/java/multithread/synchronize/example6)
+ - [Run6_exception.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java):出现异常,锁自动释放
+- [example7](src/main/java/com/brianway/learning/java/multithread/synchronize/example7)
+ - [Run7_synNotExtends.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Run7_synNotExtends.java):同步不具继承性
+- [example8](src/main/java/com/brianway/learning/java/multithread/synchronize/example8)
+ - [Run8_synchronized01.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java):`synchronized` 方法的弊端
+ - [Run8_synchronized02.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java):同步代码块解决同步方法的弊端
+- [example9](src/main/java/com/brianway/learning/java/multithread/synchronize/example9)
+ - [Run9_synchronized01.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java):当多个线程同时执行`synchronized(x){}`同步代码块时呈现效果
+ - [Run9_synchronized01_twoObjects.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java):不同的“对象监视器”
+ - [Run9_synchronized02.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java):当其他线程执行 x 对象中 `synchronized` 同步方法时呈同步效果
+ - [Run9_synchronized03.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java):当其他线程执行 x 对象里面的`synchronized(this)`代码块时,也呈现同步效果
+- [example10](src/main/java/com/brianway/learning/java/multithread/synchronize/example10)
+ - [Run10_synBlockMoreObjectOneLock.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java):验证同步 `synchronized(class)` 代码块的作用
+ - [Run10_synMoreObjectStaticOneLock.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synMoreObjectStaticOneLock.java):Class 锁可以对类的所有对象实例起作用
+ - [Run10_synTwoLock.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synTwoLock.java):验证 `synchronized` 关键字加载 `static` 静态方法和加到非静态方法不是同一个锁
+- [example11](src/main/java/com/brianway/learning/java/multithread/synchronize/example11)
+ - [Run11_StringAndSyn.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java):String 作为锁对象,常量池->同一锁
+ - [Run11_StringAndSyn2.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java):不使用 String 作为锁对象
+- [example12](src/main/java/com/brianway/learning/java/multithread/synchronize/example12)
+ - [Run12_deadLock.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java):死锁测试,jstack命令
+- [example13](src/main/java/com/brianway/learning/java/multithread/synchronize/example13)
+ - [Run13_inner01.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java):内置类和同步测试1
+ - [Run13_inner02.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java):内置类与同步测试2
+- [example14](src/main/java/com/brianway/learning/java/multithread/synchronize/example14)
+ - [Run14_setNewStringTwoLock.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java):锁对象改变
+- [example15](src/main/java/com/brianway/learning/java/multithread/synchronize/example15)
+ - [Run15_synchronized.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java):`synchronized` 代码块有 `volatile` 同步的功能
+ - [Run15_volatile.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java):不使用 `volatile` 关键字,JVM 配置 `-server`
+- [example16](src/main/java/com/brianway/learning/java/multithread/synchronize/example16)
+ - [Run16_volatile.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java):`volatile` 非原子的特性
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java
index e15cb69..0744b89 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java
@@ -6,7 +6,7 @@
/**
* P101
- * 验证同步sychronized(class)代码块的作用
+ * 验证同步synchronized(class)代码块的作用
* 顺便验证了下static方法是不能复写的
*
* @see ServiceSub,ServiceSub2
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
index 9cbbe15..8e3b8c2 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
@@ -6,12 +6,6 @@
* P112
* 内置类和同步测试1
*/
-
-/**
- * P112
- * 内置类和同步测试1
- */
-
import com.brianway.learning.java.multithread.synchronize.example13.OutClass.Inner;
public class Run13_inner01 {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java
index 1e5e686..c9ccc3c 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java
@@ -6,7 +6,7 @@
/**
* P130
- * sychronized代码块有volatile同步的功能
+ * synchronized代码块有volatile同步的功能
*/
public class Run15_synchronized {
public static void main(String[] args) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java
index d868848..3ec5fbd 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java
@@ -12,9 +12,9 @@ public class Run3_synchronized01 {
public static void main(String[] args) {
MyObject object = new MyObject();
ThreadA a = new ThreadA(object);
- a.setName("A");
+ a.setName("A ");
ThreadB b = new ThreadB(object);
- b.setName("B");
+ b.setName("B ");
a.start();
b.start();
}
@@ -25,16 +25,16 @@ public void methodA()没加synchronized
输出:
begin methodA threadName=B
begin methodA threadName=A
-A end
-B end
+A end
+B end
-------------------
public void methodA()加synchronized
输出:
begin methodA threadName=A
-A end
+A end
begin methodA threadName=B
-B end
+B end
*/
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
index 1e425ca..6f2dde5 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
@@ -7,7 +7,7 @@
/**
* P76
* 同步代码块解决同步方法的弊端
- * 但输出并不是两个c,两个d,原因?
+ * TODO 但输出并不是两个c,两个d,原因?
*/
public class Run8_synchronized02 {
public static void main(String[] args) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
index 1d5cbfe..b5994f4 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
@@ -9,7 +9,7 @@
* synchronized(非this对象x)的三个结论
* 1)当多个线程同时执行synchronized(x){}同步代码块时呈现效果
* 2)当其他线程执行x对象中synchronized同步方法时呈同步效果
- * 3)当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ * 3)当其他线程执行x对象里面的synchronized(this)代码块时,也呈现同步效果
* 验证结论1:
* 当多个线程同时执行synchronized(x){}同步代码块时呈现效果
*/
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
index b1700a1..9db4ea8 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
@@ -9,7 +9,7 @@
* synchronized(非this对象x)的三个结论
* 1)当多个线程同时执行synchronized(x){}同步代码块时呈现效果
* 2)当其他线程执行x对象中synchronized同步方法时呈同步效果
- * 3)当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ * 3)当其他线程执行x对象里面的synchronized(this)代码块时,也呈现同步效果
* 验证结论2:
* 当其他线程执行x对象中synchronized同步方法时呈同步效果
*/
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
index 805f049..26827c3 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
@@ -9,7 +9,7 @@
* synchronized(非this对象x)的三个结论
* 1)当多个线程同时执行synchronized(x){}同步代码块时呈现效果
* 2)当其他线程执行x对象中synchronized同步方法时呈同步效果
- * 3)当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ * 3)当其他线程执行x对象里面的synchronized(this)代码块时,也呈现同步效果
* 验证结论1:
* 当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
*/
From d3263388baa0c19b7f31254246110bea6cdde630 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 21 Aug 2016 20:56:02 +0800
Subject: [PATCH 04/62] [update] update README of mutithread,add communication
and lock TOC
---
java-multithread/README.md | 94 +++++++++++++++++++
.../lock/example4/Run4_notFair.java | 2 +-
.../lock/example5/Run5_getHoldCount.java | 2 +-
.../lock/example5/Run5_getQueueLength.java | 2 +-
.../example5/Run5_getWaitQueueLength.java | 4 +-
.../lock/example6/Run6_hasQueueThread.java | 4 +-
.../lock/example8/Run8_tryLock.java | 2 +-
7 files changed, 102 insertions(+), 8 deletions(-)
diff --git a/java-multithread/README.md b/java-multithread/README.md
index 8b5b41f..61f14c0 100644
--- a/java-multithread/README.md
+++ b/java-multithread/README.md
@@ -72,3 +72,97 @@
- [Run15_volatile.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java):不使用 `volatile` 关键字,JVM 配置 `-server`
- [example16](src/main/java/com/brianway/learning/java/multithread/synchronize/example16)
- [Run16_volatile.java](src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java):`volatile` 非原子的特性
+
+
+
+## communication
+
+- [example1](src/main/java/com/brianway/learning/java/multithread/communication/example1)
+ - [Run1_TwoThreadTransData.java](src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java):不使用等待/通知机制实现线程间通
+- [example2](src/main/java/com/brianway/learning/java/multithread/communication/example2)
+ - [Run2_noObjectLock.java](src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_noObjectLock.java):没有“对象监视器”,调用 `wait()` 方法出现运行时异常
+ - [Run2_notify.java](src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_notify.java):`notify` 实现通知,`notify` 调用后,并不会立即释放对象锁,而是退出 `synchronized` 代码块后
+ - [Run2_sleep.java](src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_sleep.java):测试 `sleep()` 期间其他线程是否执行
+ - [Run2_wait.java](src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_wait.java):`wait()` 永远阻塞
+- [example3](src/main/java/com/brianway/learning/java/multithread/communication/example3)
+ - [Run3_notifyAll.java](src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyAll.java):唤醒多个线程
+ - [Run3_notifyMany.java](src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyMany.java):通知多个线程
+ - [Run3_notifyOne.java](src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyOne.java):通知一个线程
+- [example4](src/main/java/com/brianway/learning/java/multithread/communication/example4)
+ - [Run4_waitHasParam.java](src/main/java/com/brianway/learning/java/multithread/communication/example4/Run4_waitHasParam.java):`wait(long)` 使用,超时自动唤醒
+ - [Run4_waitHasParam2.java](src/main/java/com/brianway/learning/java/multithread/communication/example4/Run4_waitHasParam2.java):`wait(long)` 使用,时间限制内由其他线程唤醒
+- [example5](src/main/java/com/brianway/learning/java/multithread/communication/example5)
+ - [Run5_notify.java](src/main/java/com/brianway/learning/java/multithread/communication/example5/Run5_notify.java):`notify` 正常通知
+ - [Run5_notifyEarly.java](src/main/java/com/brianway/learning/java/multithread/communication/example5/Run5_notifyEarly.java):`notify` 通知过早
+- [example6](src/main/java/com/brianway/learning/java/multithread/communication/example6)
+ - [Run6_waitOld.java](src/main/java/com/brianway/learning/java/multithread/communication/example6/Run6_waitOld.java):`wait` 等待条件变化
+- [example7](src/main/java/com/brianway/learning/java/multithread/communication/example7)
+ - [Run7_ProducerAndConsumer_One.java](src/main/java/com/brianway/learning/java/multithread/communication/example7/Run7_ProducerAndConsumer_One.java):生产者/消费者模式,一生产一消费
+- [example8](src/main/java/com/brianway/learning/java/multithread/communication/example8)
+ - [Run8_allWait.java](src/main/java/com/brianway/learning/java/multithread/communication/example8/Run8_allWait.java):多生产与多消费,假死
+- [example9](src/main/java/com/brianway/learning/java/multithread/communication/example9)
+ - [Run9_oneP_manyC.java](src/main/java/com/brianway/learning/java/multithread/communication/example9/Run9_oneP_manyC.java):一生产与多消费
+ - [Run9_oneP_oneC.java](src/main/java/com/brianway/learning/java/multithread/communication/example9/Run9_oneP_oneC.java):一生产与一消费
+- [example10](src/main/java/com/brianway/learning/java/multithread/communication/example10)
+ - [Run10_oneP_manyC.java](src/main/java/com/brianway/learning/java/multithread/communication/example10/Run10_oneP_manyC.java):一生产与多消费
+- [example11](src/main/java/com/brianway/learning/java/multithread/communication/example11)
+ - [Run11_manyP_manyC.java](src/main/java/com/brianway/learning/java/multithread/communication/example11/Run11_manyP_manyC.java):多生产与多消费
+ - [Run11_manyP_oneC.java](src/main/java/com/brianway/learning/java/multithread/communication/example11/Run11_manyP_oneC.java):多生产与一消费
+ - [Run11_oneP_manyC.java](src/main/java/com/brianway/learning/java/multithread/communication/example11/Run11_oneP_manyC.java):一生产与多消费
+- [example12](src/main/java/com/brianway/learning/java/multithread/communication/example12)
+ - [Run12_pipeInputOutput.java](src/main/java/com/brianway/learning/java/multithread/communication/example12/Run12_pipeInputOutput.java):通过管道进行线程间通信:字节流
+- [example13](src/main/java/com/brianway/learning/java/multithread/communication/example13)
+ - [Run13_wait_notify_insert.java](src/main/java/com/brianway/learning/java/multithread/communication/example13/Run13_wait_notify_insert.java):等待/通知,交叉执行
+- [example14](src/main/java/com/brianway/learning/java/multithread/communication/example14)
+ - [Run14_join.java](src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_join.java):`join` 示例
+ - [Run14_joinExption.java](src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java):`join` 的异常
+ - [Run14_joinLong.java](src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinLong.java):`join(long)` 设定等待的时间,`join(long)` 和 `sleep(long)` 运行效果并无区别,但对同步的处理不同
+- [example15](src/main/java/com/brianway/learning/java/multithread/communication/example15)
+ - [Run15_join_sleep.java](src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_join_sleep.java):`join(long)` 和 `sleep(long)` 的区别,`sleep(long)` 方法不释放锁
+ - [Run15_join_sleep_2.java](src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_join_sleep_2.java):`join(long)` 和 `sleep(long)` 的区别,`join(long)` 释放锁
+ - [Run15_joinMore.java](src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_joinMore.java):方法 `join` 后面的代码提前运行
+- [example16](src/main/java/com/brianway/learning/java/multithread/communication/example16)
+ - [Run16_InheritableThreadLocalExt.java](src/main/java/com/brianway/learning/java/multithread/communication/example16/Run16_InheritableThreadLocalExt.java):类 `InheritableThreadLocal` 使用,值继承,子线程从父线程取得值
+ - [Run16_InheritableThreadLocalExt2.java](src/main/java/com/brianway/learning/java/multithread/communication/example16/Run16_InheritableThreadLocalExt2.java):类 `InheritableThreadLocal` 使用,值继承再更改
+ - [Run16_ThreadLocal.java](src/main/java/com/brianway/learning/java/multithread/communication/example16/Run16_ThreadLocal.java):验证线程变量的隔离性
+
+
+## lock
+
+- [example1](src/main/java/com/brianway/learning/java/multithread/lock/example1)
+ - [Run1_UseConditionWaitNotify.java](src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java):使用 Condition 实现等待通知,Condition 对象的 `await()`方法,线程`WAITING`
+ - [Run1_UseConditionWaitNotifyError.java](src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyError.java):`IllegalMonitorStateException`,监视器出错
+ - [Run1_UseConditionWaitNotifyOk.java](src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java):正确使用Condition实现等待通知
+- [example2](src/main/java/com/brianway/learning/java/multithread/lock/example2)
+ - [Run2_MustUseMoreCondition.java](src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java):使用多个 condition 实现通知部分线程
+- [example3](src/main/java/com/brianway/learning/java/multithread/lock/example3)
+ - [Run3_ConditionManyToMany.java](src/main/java/com/brianway/learning/java/multithread/lock/example3/Run3_ConditionManyToMany.java):实现生产者/消费者模式,多对多交替打印
+- [example4](src/main/java/com/brianway/learning/java/multithread/lock/example4)
+ - [Run4_Fair.java](src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_Fair.java):公平锁测试,打印结果呈有序状态
+ - [Run4_notFair.java](src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_notFair.java):非公平锁测试,打印结果乱序,先启动的线程不一定先获得锁
+- [example5](src/main/java/com/brianway/learning/java/multithread/lock/example5)
+ - [Run5_getHoldCount.java](src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java):测试方法 `int getHoldCount()`
+ - [Run5_getQueueLength.java](src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getQueueLength.java):测试方法 `int getQueueLength()`
+ - [Run5_getWaitQueueLength.java](src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getWaitQueueLength.java):测试方法 `int getWaitQueueLength(Condition condition)`
+- [example6](src/main/java/com/brianway/learning/java/multithread/lock/example6)
+ - [Run6_hasQueueThread.java](src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasQueueThread.java):测试方法 `boolean hasQueueThread(Thread thread)` 和 `boolean hasQueueThreads()`
+ - [Run6_hasWaiters.java](src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasWaiters.java):测试方法 `boolean hasWaiters(Condition)`
+- [example7](src/main/java/com/brianway/learning/java/multithread/lock/example7)
+ - [Run7_isFair.java](src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isFair.java):测试方法 `boolean isFair()`
+ - [Run7_isHeldByCurrentThread.java](src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isHeldByCurrentThread.java):测试方法 `boolean isHeldByCurrentThread()`
+ - [Run7_isLocked.java](src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isLocked.java):测试方法 `boolean isLocked()`
+- [example8](src/main/java/com/brianway/learning/java/multithread/lock/example8)
+ - [Run8_lockInterruptibly1.java](src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_lockInterruptibly1.java):测试方法 `void lockInterruptibly()`
+ - [Run8_lockInterruptibly2.java](src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_lockInterruptibly2.java):测试方法 `void lockInterruptibly()`
+ - [Run8_tryLock.java](src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java):测试方法 `boolean tryLock()`
+ - [Run8_tryLock_param.java](src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock_param.java):测试方法 `boolean tryLock(long timeout,TimeUnit unit)`
+- [example9](src/main/java/com/brianway/learning/java/multithread/lock/example9)
+ - [Run9_awaitUniterruptibly1.java](src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUniterruptibly1.java):测试方法 `awaitUniterruptibly()`
+ - [Run9_awaitUniterruptibly2.java](src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUniterruptibly2.java):测试方法 `awaitUniterruptibly()`
+ - [Run9_awaitUntil1.java](src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil1.java):测试方法 `awaitUntil()`
+ - [Run9_awaitUntil2.java](src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil2.java):测试方法 `awaitUntil()`
+- [example10](src/main/java/com/brianway/learning/java/multithread/lock/example10)
+ - [Run10_condition.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_condition.java):Condition 实现顺序打印
+ - [Run10_ReadWriteLockBegin1.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java):类 `ReentrantReadWriteLock` 的使用:读读共享
+ - [Run10_ReadWriteLockBegin2.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java):类 `ReentrantReadWriteLock` 的使用:写写互斥
+ - [Run10_ReadWriteLockBegin3.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java):类 `ReentrantReadWriteLock` 的使用:读写互斥
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_notFair.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_notFair.java
index fb5d269..97a941e 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_notFair.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_notFair.java
@@ -7,7 +7,7 @@
/**
* P218
* 非公平锁测试
- * 打印结果乱序,县启动的线程不一定先获得锁
+ * 打印结果乱序,先启动的线程不一定先获得锁
*/
public class Run4_notFair {
public static void main(String[] args) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java
index 21a94c6..8415334 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java
@@ -6,7 +6,7 @@
/**
* P219
- * 测试int getHoldCount()方法
+ * 测试方法int getHoldCount()
* 查询当前线程保持此锁定的个数,即调用lock()方法的次数
*/
public class Run5_getHoldCount {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getQueueLength.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getQueueLength.java
index c342633..f6f90a3 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getQueueLength.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getQueueLength.java
@@ -6,7 +6,7 @@
/**
* P220
- * 测试int getQueueLength()方法
+ * 测试方法int getQueueLength()
* 返回正在等待获取此锁定的线程估计数
*/
public class Run5_getQueueLength {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getWaitQueueLength.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getWaitQueueLength.java
index 135dac7..4884170 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getWaitQueueLength.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getWaitQueueLength.java
@@ -6,8 +6,8 @@
/**
* P221
- * 测试int getWaitQueueLength(Condition condition)方法
- * 返回等待与此锁定相关的给定条件Conditon的线程估计数
+ * 测试方法int getWaitQueueLength(Condition condition)
+ * 返回等待与此锁定相关的给定条件Condition的线程估计数
*/
public class Run5_getWaitQueueLength {
public static void main(String[] args) throws InterruptedException {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasQueueThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasQueueThread.java
index 574d150..6d77560 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasQueueThread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasQueueThread.java
@@ -6,9 +6,9 @@
/**
* P222
- * 测试boolean hasQueueThread(Thread thread)
+ * 测试方法boolean hasQueueThread(Thread thread)
* 查询指定的线程是否正在等待获取此锁定
- * 测试boolean hasQueueThreads()
+ * 测试方法boolean hasQueueThreads()
* 查询是否有线程正在等待获取此锁定
*/
public class Run6_hasQueueThread {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java
index 30c57a0..1d6cf87 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java
@@ -7,7 +7,7 @@
/**
* P228
* 测试方法boolean tryLock()
- * 尽在调用时锁定未被另一个线程保持的情况下,才获取该锁定
+ * 仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定
*/
public class Run8_tryLock {
public static void main(String[] args) {
From 43689820cf8a639055590a0566c2884fe5e1b25c Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 21 Aug 2016 21:34:08 +0800
Subject: [PATCH 05/62] [update] update README of mutithread module,add
timer,singleton,supplement package explication
---
README.md | 2 +-
java-multithread/README.md | 80 +++++++++++++++++++
.../example2/Run2_groupAddThread.java | 2 +-
.../Run2_groupAddThreadMoreLevel.java | 2 +-
.../supplement/example3/Run3_formatOK1.java | 2 +-
.../supplement/example3/Run3_formatOK2.java | 2 +-
6 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 64147e0..52baff7 100644
--- a/README.md
+++ b/README.md
@@ -73,7 +73,7 @@
- [oschina](http://my.oschina.net/brianway)
- [CSDN](http://blog.csdn.net/h3243212/)
-邮箱: weichuyang@163.com
+Email: weichuyang@163.com
-----
diff --git a/java-multithread/README.md b/java-multithread/README.md
index 61f14c0..8380e61 100644
--- a/java-multithread/README.md
+++ b/java-multithread/README.md
@@ -166,3 +166,83 @@
- [Run10_ReadWriteLockBegin1.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java):类 `ReentrantReadWriteLock` 的使用:读读共享
- [Run10_ReadWriteLockBegin2.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java):类 `ReentrantReadWriteLock` 的使用:写写互斥
- [Run10_ReadWriteLockBegin3.java](src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java):类 `ReentrantReadWriteLock` 的使用:读写互斥
+
+
+## timer
+
+- [example1](src/main/java/com/brianway/learning/java/multithread/timer/example1):`schedule(TimerTask task, Date time)` 测试
+ - [Run1_timer1.java](src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java):在未来执行的效果,Timer 的构造方法会新启一个线程,且非守护线程
+ - [Run1_timer2.java](src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java):在未来执行的效果,Timer 的构造方法会新启一个守护线程,迅速结束,task任务未被执行
+ - [Run1_timer3.java](src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java):提前运行的效果
+ - [Run1_timer4.java](src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java):多个 TimerTask 任务及延时
+ - [Run1_timer5.java](src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java):多个TimerTask任务及延时,队列的方式,一个一个被顺序执行,前面一个耗时长则后面的任务被延后
+- [example2](src/main/java/com/brianway/learning/java/multithread/timer/example2):`schedule(TimerTask task, long delay, long period)` 测试
+ - [Run2_period1.java](src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java):在未来执行的效果
+ - [Run2_period2.java](src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java):提前运行的效果
+ - [Run2_period3.java](src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java):任务执行时间被延时
+- [example3](src/main/java/com/brianway/learning/java/multithread/timer/example3)
+ - [Run3_cancel1.java](src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java):`TimerTask` 类的 `cancel()` 方法,将自身从任务队列移除,其他任务不受影响
+ - [Run3_cancel2.java](src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java):`Timer` 类的 `cancel()`方法,全部任务被清除,且进程被销毁
+ - [Run3_cancel3.java](src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java):`Timer` 类的 `cancel()`方法,有时不一定会停止计划任务
+- [example4](src/main/java/com/brianway/learning/java/multithread/timer/example4)
+ - [Run4_schedule1.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java):`schedule(TimerTask task, long delay)` 方法
+ - [Run4_schedule2.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java):`schedule(TimerTask task, long delay, long period)` 方法
+ - [Run4_schedule3.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java):`schedule(TimerTask task, Date firstTime, long period)` 方法
+ - [Run4_schedule4.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java):`schedule(TimerTask task, long delay, long period)` 方法
+ - [Run4_schedule5.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java):`schedule(TimerTask task, Date firstTime, long period)` 方法
+ - [Run4_schedule6.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java):`schedule(TimerTask task, long delay, long period)` 方法
+ - [Run4_schedule_vs_scheduleAtFixedRate_1.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java):schedule 不具有追赶执行性
+ - [Run4_schedule_vs_scheduleAtFixedRate_2.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java):scheduleAtFixedRate 具有追赶执行性
+ - [Run4_scheduleAtFixedRate1.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java):`scheduleAtFixedRate(TimerTask task, Date firstTime,long period)` 方法
+ - [Run4_scheduleAtFixedRate2.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java):`scheduleAtFixedRate(TimerTask task, long delay, long period)` 方法
+ - [Run4_scheduleAtFixedRate3.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java):`scheduleAtFixedRate(TimerTask task, Date firstTime, long period)` 方法
+ - [Run4_scheduleAtFixedRate4.java](src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java):`scheduleAtFixedRate(TimerTask task, long delay, long period)` 方法
+
+
+## singleton
+
+
+- [example1](src/main/java/com/brianway/learning/java/multithread/singleton/example1)
+ - [Run1_singleton0.java](src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java):立即加载/“饿汉模式”
+ - [Run1_singleton1.java](src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton1.java):延迟加载/“懒汉模式”(会出问题)
+ - [Run1_singleton2.java](src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java):延迟加载/“懒汉模式”缺点展示
+- [example2](src/main/java/com/brianway/learning/java/multithread/singleton/example2):延迟加载/“懒汉模式”解决方案
+ - [Run2_singleton1.java](src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java):声明 `synchronized` 关键字,整个方法上锁
+ - [Run2_singleton2.java](src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java):声明 `synchronized` 关键字,同步代码块
+ - [Run2_singleton3.java](src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java):声明 `synchronized` 关键字,部分代码上锁
+ - [Run2_singleton4.java](src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java):DCL 双检查锁机制
+- [example3](src/main/java/com/brianway/learning/java/multithread/singleton/example3)
+ - [Run3_singleton1.java](src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java):使用静态内置类实现单例模式
+ - [Run3_singleton2.java](src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton2.java):序列化与反序列化的单例模式实现
+ - [Run3_singleton3.java](src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton3.java):使用 `static` 代码块实现单例模式
+ - [Run3_singleton4.java](src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton4.java):使用 `enum` 枚举数据类型实现单例模式
+ - [Run3_singleton5.java](src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton5.java):使用 `enum` 枚举数据类型实现单例模式
+
+
+## supplement
+
+- [example1](src/main/java/com/brianway/learning/java/multithread/supplement/example1)
+ - [Run1_state1.java](src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state1.java):验证 `NEW,RUNNABLE`,`TERMINATED`
+ - [Run1_state2.java](src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java):验证 `TIMED_WAITING`
+ - [Run1_state3.java](src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java):验证 `BLOCKED`
+- [example2](src/main/java/com/brianway/learning/java/multithread/supplement/example2)
+ - [Run2_autoAddGroup.java](src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_autoAddGroup.java):线程组自动归属特性
+ - [Run2_getGroupParent.java](src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_getGroupParent.java):获取根线程组,JVM 根线程组就是 system
+ - [Run2_groupAddThread.java](src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java)线程对象关联线程组,一级关联
+ - [Run2_groupAddThreadMoreLevel.java](src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThreadMoreLevel.java):线程对象关联线程组,多级关联
+ - [Run2_threadRunSyn.java](src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_threadRunSyn.java):使线程具有有序性
+- [example3](src/main/java/com/brianway/learning/java/multithread/supplement/example3)
+ - [Run3_formatError.java](src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java):`SimpleDateFormat` 类非线程安全
+ - [Run3_formatOK1.java](src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java):`SimpleDateFormat` 类非线程安全,解决异常方法一
+ - [Run3_formatOK2.java](src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java):`SimpleDateFormat` 类非线程安全,解决异常方法二
+- [example4](src/main/java/com/brianway/learning/java/multithread/supplement/example4)
+ - [Run4_threadCreateException.java](src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java):线程中出现异常
+ - [Run4_threadCreateException2.java](src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java):线程中出现异常,捕捉
+ - [Run4_threadCreateException3.java](src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java):线程中出现异常,捕捉
+- [example5](src/main/java/com/brianway/learning/java/multithread/supplement/example5)
+ - [Run5_threadGroup1.java](src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java):线程组内处理异常
+ - [Run5_threadGroup2.java](src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup2.java):线程组内处理异常
+- [example6](src/main/java/com/brianway/learning/java/multithread/supplement/example6)
+ - [Run6_threadExceptionMove1.java](src/main/java/com/brianway/learning/java/multithread/supplement/example6/Run6_threadExceptionMove1.java)
+ - [Run6_threadExceptionMove2.java](src/main/java/com/brianway/learning/java/multithread/supplement/example6/Run6_threadExceptionMove2.java)
+
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java
index 29e8aa2..45e44bd 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java
@@ -6,7 +6,7 @@
/**
* P286
- * 线程对象关联线程组,1级关联
+ * 线程对象关联线程组,一级关联
*/
public class Run2_groupAddThread {
public static void main(String[] args) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThreadMoreLevel.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThreadMoreLevel.java
index e777e9a..9e9c9fa 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThreadMoreLevel.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThreadMoreLevel.java
@@ -6,7 +6,7 @@
/**
* P287
- * 线程对象关联线程组:多级关联
+ * 线程对象关联线程组,多级关联
*/
public class Run2_groupAddThreadMoreLevel {
public static void main(String[] args) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
index f5469bc..543b8b3 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
@@ -8,7 +8,7 @@
/**
* P295
- * SimpleDateFormat类非线程安全,解决异常方法1
+ * SimpleDateFormat类非线程安全,解决异常方法一
*/
public class Run3_formatOK1 {
public static void main(String[] args) {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
index 756ff1d..a082358 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
@@ -8,7 +8,7 @@
/**
* P296
- * SimpleDateFormat类非线程安全,解决异常方法2
+ * SimpleDateFormat类非线程安全,解决异常方法二
*/
public class Run3_formatOK2 {
public static void main(String[] args) {
From adaa365040dd19596aa1bb1911032cedb3b5130a Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 30 Oct 2016 23:02:01 +0800
Subject: [PATCH 06/62] [update] update the README about future plan.
---
README.md | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/README.md b/README.md
index 52baff7..f9a446d 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
# 我的java学习笔记
-笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解java基础语法,想进一步深入学习的人
+旨在打造在线最佳的 java 学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解 java 基础语法,想进一步深入学习的人
-含**博客讲解**和**源码实例**,采用maven构建,分模块学习,涉及反射,代理,多线程,IO,集合类等核心知识。
+含**博客讲解**和**源码实例**,采用 maven 构建,分模块学习,涉及反射,代理,多线程,IO,集合类等核心知识。
-**如果觉得不错,请先在这个仓库上点个star吧**,这也是对我的肯定和鼓励,谢谢了。
+**如果觉得不错,请先在这个仓库上点个 star 吧**,这也是对我的肯定和鼓励,谢谢了。
不定时进行调整和补充,需要关注更新的请 Watch、Star、Fork
@@ -16,14 +16,14 @@
**点击相应的模块能看到每个目录的说明文档**
- [blogs](/blogs):博客文档
-- [java-base](/java-base):java基础巩固模块的java源码
-- [java-multithread](/java-multithread):多线程模块的java源码
+- [java-base](/java-base):java基础巩固模块的 java 源码
+- [java-multithread](/java-multithread):多线程模块的 java 源码
# 博客文档
-如果你只是单纯要阅读的话,建议移步CSDN或者oschina上观看,访问速度快很多:
+如果你只是单纯要阅读的话,建议移步 CSDN 或者 oschina 上观看,访问速度快很多:
>* CSDN:[我的java&javaweb学习笔记(汇总)](http://blog.csdn.net/h3243212/article/details/50659471)
>* oschina:[我的java&javaweb学习笔记(汇总)](http://my.oschina.net/brianway/blog/614355)
@@ -49,29 +49,31 @@
- [javaweb入门笔记(5)-cookie和session.md](/blogs/javaweb/javaweb入门笔记(5)-cookie和session.md)
- [javaweb入门笔记(6)-JSP技术.md](/blogs/javaweb/javaweb入门笔记(6)-JSP技术.md)
-
------
+
+-----
# TODO
计划将这个仓库进行重构,逐步扩充并实现下面的功能。
-* [x] 整理成maven的结构,使用聚合和继承特性(2016.4.12完成)
-* [ ] 原有的javase部分代码重构为java-base模块,并逐步上传代码
-* [x] 多线程部分使用java-multithread模块(2016.4.17完成)
-* [ ] 集合类部分使用模块java-collection
+* [x] 整理成 maven 的结构,使用聚合和继承特性(2016.4.12完成)
+* [ ] 原有的 javase 部分代码重构为 java-base 模块,并逐步上传代码
+* [x] 多线程部分使用 java-multithread 模块(2016.4.17完成)
+* [ ] 集合类部分使用模块 java-collections
* [ ] IO部分使用模块java-io
+* [ ] java虚拟机相关部分使用模块 java-jvm
+* [ ] java 8 新特性使用模块 java8
-
-----
# 联系作者
- [Brian's Personal Website](http://brianway.github.io/)
-- [oschina](http://my.oschina.net/brianway)
- [CSDN](http://blog.csdn.net/h3243212/)
+- [oschina](http://my.oschina.net/brianway)
+
Email: weichuyang@163.com
From 0616b6e07441bb95c54653465412311ee5f59c75 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Thu, 10 Nov 2016 16:32:04 +0800
Subject: [PATCH 07/62] [add] add some examples in java-base module.
---
.../brianway/learning/java/base/Binary.java | 14 ++++++
.../java/base/constructor/FatherClass.java | 7 ++-
.../java/base/constructor/SonClass.java | 19 +++++---
.../java/base/{ => datatype}/Boxing.java | 23 +++++-----
.../java/base/datatype/IntegerChanger.java | 44 +++++++++++++++++++
.../java/base/datatype/NumberEquation.java | 22 ++++++++++
.../java/base/innerclass/ClassCreator.java | 16 +++++++
.../java/base/innerclass/EnclosingOne.java | 21 +++++++++
8 files changed, 149 insertions(+), 17 deletions(-)
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/Binary.java
rename java-base/src/main/java/com/brianway/learning/java/base/{ => datatype}/Boxing.java (57%)
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/datatype/IntegerChanger.java
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/datatype/NumberEquation.java
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/innerclass/ClassCreator.java
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/innerclass/EnclosingOne.java
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/Binary.java b/java-base/src/main/java/com/brianway/learning/java/base/Binary.java
new file mode 100644
index 0000000..f970cd5
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/Binary.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.base;
+
+/**
+ * Created by brian on 16/11/10.
+ *
+ * TODO 补码/反码相关知识
+ */
+public class Binary {
+ public static void main(String[] args) {
+ int i = 5;
+ int j = 10;
+ System.out.println(i + ~j);
+ }
+}
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java b/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
index bea7928..4ccca61 100644
--- a/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
+++ b/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
@@ -4,14 +4,19 @@
* Created by Brian on 2016/4/14.
*/
public class FatherClass {
+ protected static int count = 10;
private String name;
+ static {
+ System.out.println("父类的静态属性count初始化:" + count);
+ }
+
public FatherClass() {
System.out.println("执行了父类的无参构造方法");
}
public FatherClass(String name) {
this.name = name;
- System.out.println("执行了父类的构造方法FatherClass(String name)");
+ System.out.println("执行了父类的构造方法FatherClass(String name) " + name);
}
}
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java b/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
index 3289afe..6ea4cb4 100644
--- a/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
+++ b/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
@@ -2,16 +2,22 @@
/**
* Created by Brian on 2016/4/14.
- */
-
-/**
+ *
* 构造方法调用问题
* 子类构造方法会首先默认调用父类的无参构造方法,无论是否显式写了super();
*/
public class SonClass extends FatherClass {
+
+ private static int countSon;
+
+ static {
+ System.out.println("子类可以访问父类的静态属性count " + count);
+ System.out.println("子类的静态属性countSon初始化:" + countSon);
+ }
+
public SonClass(String name) {
//super(name);
- System.out.println("执行了子类的构造方法SonClass(String name)");
+ System.out.println("执行了子类的构造方法SonClass(String name) " + name);
}
public SonClass() {
@@ -26,8 +32,11 @@ public static void main(String[] args) {
}
/*
+父类的静态属性count初始化:10
+子类可以访问父类的静态属性count 10
+子类的静态属性countSon初始化:0
执行了父类的无参构造方法
-执行了子类的构造方法SonClass(String name)
+执行了子类的构造方法SonClass(String name) aaa
执行了父类的无参构造方法
执行了子类的无参构造方法
*/
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/Boxing.java b/java-base/src/main/java/com/brianway/learning/java/base/datatype/Boxing.java
similarity index 57%
rename from java-base/src/main/java/com/brianway/learning/java/base/Boxing.java
rename to java-base/src/main/java/com/brianway/learning/java/base/datatype/Boxing.java
index 8ec2160..8ac8da7 100644
--- a/java-base/src/main/java/com/brianway/learning/java/base/Boxing.java
+++ b/java-base/src/main/java/com/brianway/learning/java/base/datatype/Boxing.java
@@ -1,13 +1,11 @@
-package com.brianway.learning.java.base;
+package com.brianway.learning.java.base.datatype;
/**
* Created by Brian on 2016/4/14.
- */
-
-/**
- * TODO
- * 待理解。
- * 应该是考装箱和拆箱
+ *
+ * TODO 有些细节待理解
+ *
+ * 主要是考装箱和拆箱
*/
public class Boxing {
public static void main(String[] args) {
@@ -24,16 +22,19 @@ public static void main(String[] args) {
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
+ System.out.println(new Integer(2) == new Integer(2));
}
}
/*
-输出:
-true
-false
-true
+输出: 原因:
+true 自动装箱,缓存
+false 自动装箱,未缓存
true
+true 调用 equals(),比较的是值,而不是对象地址
true
false
+false 比较的是对象地址
+
*/
\ No newline at end of file
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/datatype/IntegerChanger.java b/java-base/src/main/java/com/brianway/learning/java/base/datatype/IntegerChanger.java
new file mode 100644
index 0000000..45326c8
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/datatype/IntegerChanger.java
@@ -0,0 +1,44 @@
+package com.brianway.learning.java.base.datatype;
+
+import java.lang.reflect.Field;
+
+/**
+ * Created by brian on 16/11/1.
+ *
+ * 涉及到的知识点:
+ * 1.java 的参数传递都是值传递
+ * 2.Integer的内部实现(value,缓存,等等)
+ * 3.反射操作(可访问性)
+ * 4.自动装箱和拆箱
+ *
+ * 参考博客 http://www.voidcn.com/blog/zgwangbo/article/p-6101689.html
+ */
+public class IntegerChanger {
+
+ public static void main(String[] args) {
+ Integer a = 1, b = 2;
+ System.out.println("before swap a = " + a + ", b = " + b);
+ swap(a, b);
+ System.out.println("after swap a = " + a + ", b = " + b);
+
+ Integer c = 1;
+ System.out.println("(警告:Integer缓存被改了,代码里:Integer c = 1;) 实际c=" + c);
+ }
+
+ public static void swap(Integer i1, Integer i2) {
+ try {
+ Field f = Integer.class.getDeclaredField("value");
+ f.setAccessible(true);
+
+ int tmp = i1;
+ f.setInt(i1, i2);
+ f.setInt(i2, tmp);
+
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/datatype/NumberEquation.java b/java-base/src/main/java/com/brianway/learning/java/base/datatype/NumberEquation.java
new file mode 100644
index 0000000..6cd718b
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/datatype/NumberEquation.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.base.datatype;
+
+/**
+ * Created by brian on 16/11/10.
+ *
+ * 包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱;
+ * 包装类的equals()方法不处理数据转型.
+ */
+public class NumberEquation {
+ public static void main(String[] args) {
+ Integer i = 42;
+ Long l = 42l;
+ Double d = 42.0;
+
+ System.out.println(i.equals(d)); // false
+ System.out.println(d.equals(l)); // false
+ System.out.println(i.equals(l)); // false
+ System.out.println(l.equals(42L)); // true
+ }
+}
+
+// (i == l),(i == d),(l == d)会出现编译错误
\ No newline at end of file
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/innerclass/ClassCreator.java b/java-base/src/main/java/com/brianway/learning/java/base/innerclass/ClassCreator.java
new file mode 100644
index 0000000..09de444
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/innerclass/ClassCreator.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.base.innerclass;
+
+/**
+ * Created by brian on 16/11/10.
+ *
+ * 创建内部类的测试类
+ */
+public class ClassCreator {
+ public static void main(String[] args) {
+ //在其他类里创建非静态内部类和静态内部类
+ EnclosingOne eo = new EnclosingOne();
+ EnclosingOne.InsideOne io = eo.new InsideOne();
+ EnclosingOne.InsideTwo it = new EnclosingOne.InsideTwo();
+ }
+
+}
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/innerclass/EnclosingOne.java b/java-base/src/main/java/com/brianway/learning/java/base/innerclass/EnclosingOne.java
new file mode 100644
index 0000000..4718fd4
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/innerclass/EnclosingOne.java
@@ -0,0 +1,21 @@
+package com.brianway.learning.java.base.innerclass;
+
+/**
+ * Created by brian on 16/11/10.
+ */
+public class EnclosingOne {
+
+ public class InsideOne {
+
+ }
+
+ static public class InsideTwo {
+
+ }
+
+ public static void main(String[] args) {
+ EnclosingOne eo = new EnclosingOne();
+ InsideOne io = eo.new InsideOne();
+ InsideTwo it = new InsideTwo();
+ }
+}
From 30a5eac5c27d8365b43f2f632a3d596881f20a07 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sat, 19 Nov 2016 18:44:35 +0800
Subject: [PATCH 08/62] [add] add module java-container and update README.
---
README.md | 6 +++---
.../brianway/learning/java/base/Binary.java | 18 ++++++++++++++++++
java-container/pom.xml | 14 ++++++++++++++
pom.xml | 1 +
4 files changed, 36 insertions(+), 3 deletions(-)
create mode 100644 java-container/pom.xml
diff --git a/README.md b/README.md
index f9a446d..aee7c1a 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@
**点击相应的模块能看到每个目录的说明文档**
- [blogs](/blogs):博客文档
-- [java-base](/java-base):java基础巩固模块的 java 源码
+- [java-base](/java-base):java 基础巩固模块的 java 源码
- [java-multithread](/java-multithread):多线程模块的 java 源码
@@ -60,8 +60,8 @@
* [x] 整理成 maven 的结构,使用聚合和继承特性(2016.4.12完成)
* [ ] 原有的 javase 部分代码重构为 java-base 模块,并逐步上传代码
* [x] 多线程部分使用 java-multithread 模块(2016.4.17完成)
-* [ ] 集合类部分使用模块 java-collections
-* [ ] IO部分使用模块java-io
+* [ ] 容器类部分使用模块 java-container
+* [ ] IO 部分使用模块 java-io
* [ ] java虚拟机相关部分使用模块 java-jvm
* [ ] java 8 新特性使用模块 java8
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/Binary.java b/java-base/src/main/java/com/brianway/learning/java/base/Binary.java
index f970cd5..2a8849a 100644
--- a/java-base/src/main/java/com/brianway/learning/java/base/Binary.java
+++ b/java-base/src/main/java/com/brianway/learning/java/base/Binary.java
@@ -4,11 +4,29 @@
* Created by brian on 16/11/10.
*
* TODO 补码/反码相关知识
+ * https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
+ * http://weihe6666.iteye.com/blog/1190033
+ *
+ * 在计算机中,负数以原码的补码形式表达。
*/
public class Binary {
public static void main(String[] args) {
int i = 5;
int j = 10;
System.out.println(i + ~j);
+
+ int[] arr = new int[] {3, -2};
+ for (int a : arr) {
+ //原数
+ System.out.println("a:" + a + " 二进制:" + Integer.toBinaryString(a));
+ // 按位取反
+ System.out.println("~a:" + ~a + " 二进制:" + Integer.toBinaryString(~a));
+ // 相反数
+ System.out.println("-a:" + -a + " 二进制:" + Integer.toBinaryString(-a));
+
+ System.out.println(-a == ~a + 1);
+ System.out.println(~a == -a - 1);
+ }
+
}
}
diff --git a/java-container/pom.xml b/java-container/pom.xml
new file mode 100644
index 0000000..7f8d9ed
--- /dev/null
+++ b/java-container/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ java-learning
+ com.brianway.learning.java
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ java-container
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9c68e4b..9901359 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,7 @@
java-multithread
java-base
+ java-container
From 1b9e2a23fd27f5dbb024cc343372d1c43f65a12f Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Mon, 21 Nov 2016 23:56:46 +0800
Subject: [PATCH 09/62] [update] update REAMDE,plan for java-container module.
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index aee7c1a..cd387e7 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# 我的java学习笔记
-旨在打造在线最佳的 java 学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解 java 基础语法,想进一步深入学习的人
+旨在打造在线最佳的 java 学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解 java 基础语法,想进一步深入学习的人
含**博客讲解**和**源码实例**,采用 maven 构建,分模块学习,涉及反射,代理,多线程,IO,集合类等核心知识。
@@ -18,7 +18,7 @@
- [blogs](/blogs):博客文档
- [java-base](/java-base):java 基础巩固模块的 java 源码
- [java-multithread](/java-multithread):多线程模块的 java 源码
-
+- [java-container](/java-container):容器类模块的 java 源码
# 博客文档
From 724ffb2a1a12983bdad16879d34af3a693a4f8bd Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Mon, 28 Nov 2016 18:53:27 +0800
Subject: [PATCH 10/62] [add] add module java-io and add examples about File
---
java-io/pom.xml | 14 +++
.../brianway/learning/java/io/DirList.java | 32 +++++++
.../learning/java/io/MakeDirectories.java | 86 +++++++++++++++++++
pom.xml | 1 +
4 files changed, 133 insertions(+)
create mode 100644 java-io/pom.xml
create mode 100644 java-io/src/main/java/com/brianway/learning/java/io/DirList.java
create mode 100755 java-io/src/main/java/com/brianway/learning/java/io/MakeDirectories.java
diff --git a/java-io/pom.xml b/java-io/pom.xml
new file mode 100644
index 0000000..d62726d
--- /dev/null
+++ b/java-io/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ java-learning
+ com.brianway.learning.java
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ java-io
+
+
\ No newline at end of file
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/DirList.java b/java-io/src/main/java/com/brianway/learning/java/io/DirList.java
new file mode 100644
index 0000000..c7e8898
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/DirList.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.io;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+/**
+ * Created by brian on 16/11/28.
+ * 列举文件/文件夹
+ */
+public class DirList {
+ public static void main(final String[] args) {
+ File path = new File(".");
+ String[] list;
+ if (args.length == 0) {
+ list = path.list();
+ } else {
+ list = path.list(new FilenameFilter() {
+ private Pattern pattern = Pattern.compile(args[0]); // final String[] args
+
+ public boolean accept(File dir, String name) {
+ return pattern.matcher(name).matches();
+ }
+ });
+ }
+ Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
+ for (String dirItem : list) {
+ System.out.println(dirItem);
+ }
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/MakeDirectories.java b/java-io/src/main/java/com/brianway/learning/java/io/MakeDirectories.java
new file mode 100755
index 0000000..d48d7dc
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/MakeDirectories.java
@@ -0,0 +1,86 @@
+package com.brianway.learning.java.io;
+//: io/MakeDirectories.java
+// Demonstrates the use of the File class to
+// create directories and manipulate files.
+// {Args: MakeDirectoriesTest}
+
+import java.io.File;
+
+public class MakeDirectories {
+ private static void usage() {
+ System.err.println(
+ "Usage:MakeDirectories path1 ...\n" +
+ "Creates each path\n" +
+ "Usage:MakeDirectories -d path1 ...\n" +
+ "Deletes each path\n" +
+ "Usage:MakeDirectories -r path1 path2\n" +
+ "Renames from path1 to path2");
+ System.exit(1);
+ }
+
+ private static void fileData(File f) {
+ System.out.println(
+ "Absolute path: " + f.getAbsolutePath() +
+ "\n Can read: " + f.canRead() +
+ "\n Can write: " + f.canWrite() +
+ "\n getName: " + f.getName() +
+ "\n getParent: " + f.getParent() +
+ "\n getPath: " + f.getPath() +
+ "\n length: " + f.length() +
+ "\n lastModified: " + f.lastModified());
+ if (f.isFile()) {
+ System.out.println("It's a file");
+ } else if (f.isDirectory()) {
+ System.out.println("It's a directory");
+ }
+ }
+
+ public static void main(String[] args) {
+ if (args.length < 1) usage();
+ if (args[0].equals("-r")) {
+ if (args.length != 3) usage();
+ File
+ old = new File(args[1]),
+ rname = new File(args[2]);
+ old.renameTo(rname);
+ fileData(old);
+ fileData(rname);
+ return; // Exit main
+ }
+ int count = 0;
+ boolean del = false;
+ if (args[0].equals("-d")) {
+ count++;
+ del = true;
+ }
+ count--;
+ while (++count < args.length) {
+ File f = new File(args[count]);
+ if (f.exists()) {
+ System.out.println(f + " exists");
+ if (del) {
+ System.out.println("deleting..." + f);
+ f.delete();
+ }
+ } else { // Doesn't exist
+ if (!del) {
+ f.mkdirs();
+ System.out.println("created " + f);
+ }
+ }
+ fileData(f);
+ }
+ }
+}
+/* Output: (80% match)
+created MakeDirectoriesTest
+Absolute path: d:\aaa-TIJ4\code\io\MakeDirectoriesTest
+ Can read: true
+ Can write: true
+ getName: MakeDirectoriesTest
+ getParent: null
+ getPath: MakeDirectoriesTest
+ length: 0
+ lastModified: 1101690308831
+It's a directory
+*///:~
diff --git a/pom.xml b/pom.xml
index 9901359..5bf3a88 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
java-multithread
java-base
java-container
+ java-io
From a76f7a428bc5affaff98c97b840a0cf764ad2a7e Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Mon, 28 Nov 2016 22:22:54 +0800
Subject: [PATCH 11/62] [add] add io examples
---
.../learning/java/io/BufferedInputFile.java | 28 +++++
.../com/brianway/learning/java/io/Echo.java | 25 +++++
.../brianway/learning/java/io/FileOutput.java | 60 ++++++++++
.../learning/java/io/MemoryInput.java | 55 +++++++++
.../brianway/learning/java/io/TextFile.java | 104 ++++++++++++++++++
java-io/src/main/resources/infile.txt | 12 ++
6 files changed, 284 insertions(+)
create mode 100644 java-io/src/main/java/com/brianway/learning/java/io/BufferedInputFile.java
create mode 100644 java-io/src/main/java/com/brianway/learning/java/io/Echo.java
create mode 100644 java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
create mode 100755 java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java
create mode 100755 java-io/src/main/java/com/brianway/learning/java/io/TextFile.java
create mode 100644 java-io/src/main/resources/infile.txt
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/BufferedInputFile.java b/java-io/src/main/java/com/brianway/learning/java/io/BufferedInputFile.java
new file mode 100644
index 0000000..213424d
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/BufferedInputFile.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java.io;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by brian on 16/11/28.
+ */
+public class BufferedInputFile {
+ public static String read(String filename) throws IOException {
+ BufferedReader in = new BufferedReader(
+ new FileReader(filename));
+ String s;
+ StringBuilder sb = new StringBuilder();
+ while ((s = in.readLine()) != null) {
+ sb.append(s).append("\n");
+ }
+ in.close();
+ return sb.toString();
+ }
+
+ public static void main(String[] args) throws IOException {
+ String file = BufferedInputFile.class.getResource("/").getPath()
+ + "/infile.txt";
+ System.out.print(read(file));
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/Echo.java b/java-io/src/main/java/com/brianway/learning/java/io/Echo.java
new file mode 100644
index 0000000..34ba225
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/Echo.java
@@ -0,0 +1,25 @@
+package com.brianway.learning.java.io;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+
+/**
+ * Created by brian on 16/11/28.
+ *
+ * 从标准输入中读取,并将 System.out 转换成 PrintWriter
+ */
+public class Echo {
+ public static void main(String[] args) throws IOException {
+ BufferedReader stdin = new BufferedReader(
+ new InputStreamReader(System.in));
+ PrintWriter out = new PrintWriter(System.out, true);// 开启自动清空
+
+ String s;
+ while ((s = stdin.readLine()) != null && s.length() != 0) {
+ //System.out.println(s);
+ out.println(s);
+ }
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java b/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
new file mode 100644
index 0000000..c78f419
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
@@ -0,0 +1,60 @@
+package com.brianway.learning.java.io;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+
+/**
+ * Created by brian on 16/11/28.
+ */
+public class FileOutput {
+
+ /**
+ * 基本的文件输出
+ */
+ public static void basic(String infile, String outfile) throws IOException {
+ BufferedReader in = new BufferedReader(
+ new StringReader(
+ BufferedInputFile.read(infile)));
+ PrintWriter out = new PrintWriter(
+ new BufferedWriter(new FileWriter(outfile)));
+ int lineCount = 1;
+ String s;
+ while ((s = in.readLine()) != null) {
+ out.println(lineCount++ + ": " + s);
+ }
+ out.close();
+ System.out.println(BufferedInputFile.read(outfile));
+ }
+
+ /**
+ * 文本文件输出的快捷方式
+ */
+ public static void shortcut(String infile, String outfile)throws IOException{
+ BufferedReader in = new BufferedReader(
+ new StringReader(
+ BufferedInputFile.read(infile)));
+ PrintWriter out = new PrintWriter(outfile);
+ int lineCount = 1;
+ String s;
+ while ((s = in.readLine()) != null) {
+ out.println(lineCount++ + ": " + s);
+ }
+ out.close();
+ System.out.println(BufferedInputFile.read(outfile));
+ }
+
+ public static void main(String[] args) throws IOException {
+ String parent = BufferedInputFile.class.getResource("/").getPath();
+ String infile = parent + "/infile.txt";
+
+ String outfile = parent + "/BasicOut";
+ basic(infile, outfile);
+
+ outfile = parent+"ShortcutOut";
+ shortcut(infile,outfile);
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java b/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java
new file mode 100755
index 0000000..d8a1973
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java
@@ -0,0 +1,55 @@
+package com.brianway.learning.java.io;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+
+/**
+ * Created by brian on 16/11/28.
+ * 内存输入
+ */
+
+public class MemoryInput {
+
+ /**
+ * 从内存输入
+ */
+ public static void useStringReader(String filename) {
+ try {
+ StringReader in = new StringReader(
+ BufferedInputFile.read(filename));
+ int c;
+ while ((c = in.read()) != -1)
+ System.out.print((char) c);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ /**
+ * 格式化的内存输入
+ */
+ public static void readFormattedInput(String filename) {
+ try {
+ DataInputStream in = new DataInputStream(
+ new ByteArrayInputStream(
+ BufferedInputFile.read(filename)
+ .getBytes()));
+ while (in.available() != 0) {
+ System.out.print((char) in.readByte());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args)
+ throws IOException {
+ String filename = BufferedInputFile.class.getResource("/").getPath()
+ + "/infile.txt";
+ useStringReader(filename);
+ readFormattedInput(filename);
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java b/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java
new file mode 100755
index 0000000..6c76eab
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java
@@ -0,0 +1,104 @@
+package com.brianway.learning.java.io;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.TreeSet;
+
+/**
+ * Static functions for reading and writing text files as
+ * a single string, and treating a file as an ArrayList.
+ */
+public class TextFile extends ArrayList {
+ // Read a file as a single string:
+ public static String read(String fileName) {
+ StringBuilder sb = new StringBuilder();
+ try {
+ BufferedReader in = new BufferedReader(
+ new FileReader(
+ new File(fileName).getAbsoluteFile()));
+ try {
+ String s;
+ while ((s = in.readLine()) != null) {
+ sb.append(s);
+ sb.append("\n");
+ }
+ } finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return sb.toString();
+ }
+
+ // Write a single file in one method call:
+ public static void write(String fileName, String text) {
+ try {
+ PrintWriter out = new PrintWriter(
+ new File(fileName).getAbsoluteFile());
+ try {
+ out.print(text);
+ } finally {
+ out.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // Read a file, split by any regular expression:
+ public TextFile(String fileName, String splitter) {
+ super(Arrays.asList(read(fileName).split(splitter)));
+ // Regular expression split() often leaves an empty
+ // String at the first position:
+ if (get(0).equals("")) remove(0);
+ }
+
+ // Normally read by lines:
+ public TextFile(String fileName) {
+ this(fileName, "\n");
+ }
+
+ public void write(String fileName) {
+ try {
+ PrintWriter out = new PrintWriter(
+ new File(fileName).getAbsoluteFile());
+ try {
+ for (String item : this)
+ out.println(item);
+ } finally {
+ out.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // Simple test:
+ public static void main(String[] args) {
+ String parent = BufferedInputFile.class.getResource("/").getPath();
+ String inFileName = parent + "/infile.txt";
+
+ String file = read(inFileName);
+ write(parent + "/text.txt", file);
+ TextFile text = new TextFile(parent + "/text.txt");
+ text.write(parent + "test2.txt");
+ // Break into unique sorted list of words:
+ TreeSet words = new TreeSet(
+ new TextFile(inFileName, "\\W+"));
+ // Display the capitalized words:
+ System.out.println(words.headSet("a"));
+
+ }
+}
+
diff --git a/java-io/src/main/resources/infile.txt b/java-io/src/main/resources/infile.txt
new file mode 100644
index 0000000..a643f77
--- /dev/null
+++ b/java-io/src/main/resources/infile.txt
@@ -0,0 +1,12 @@
+-----------------------------------------
+public static String read(String filename) throws IOException {
+ BufferedReader in = new BufferedReader(
+ new FileReader(filename));
+ String s;
+ StringBuilder sb = new StringBuilder();
+ while ((s = in.readLine()) != null) {
+ sb.append(s).append("\n");
+ }
+ in.close();
+ return sb.toString();
+}
\ No newline at end of file
From 5423ec56a5640ca4accea28943a34ad9f7f2b196 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Tue, 29 Nov 2016 13:54:11 +0800
Subject: [PATCH 12/62] [update] update the class that resource path gets from
in main methods
---
.../src/main/java/com/brianway/learning/java/io/FileOutput.java | 2 +-
.../main/java/com/brianway/learning/java/io/MemoryInput.java | 2 +-
.../src/main/java/com/brianway/learning/java/io/TextFile.java | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java b/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
index c78f419..9481ada 100644
--- a/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
+++ b/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
@@ -48,7 +48,7 @@ public static void shortcut(String infile, String outfile)throws IOException{
}
public static void main(String[] args) throws IOException {
- String parent = BufferedInputFile.class.getResource("/").getPath();
+ String parent = FileOutput.class.getResource("/").getPath();
String infile = parent + "/infile.txt";
String outfile = parent + "/BasicOut";
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java b/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java
index d8a1973..7b459ed 100755
--- a/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java
+++ b/java-io/src/main/java/com/brianway/learning/java/io/MemoryInput.java
@@ -47,7 +47,7 @@ public static void readFormattedInput(String filename) {
public static void main(String[] args)
throws IOException {
- String filename = BufferedInputFile.class.getResource("/").getPath()
+ String filename = MemoryInput.class.getResource("/").getPath()
+ "/infile.txt";
useStringReader(filename);
readFormattedInput(filename);
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java b/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java
index 6c76eab..6170202 100755
--- a/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java
+++ b/java-io/src/main/java/com/brianway/learning/java/io/TextFile.java
@@ -86,7 +86,7 @@ public void write(String fileName) {
// Simple test:
public static void main(String[] args) {
- String parent = BufferedInputFile.class.getResource("/").getPath();
+ String parent = TextFile.class.getResource("/").getPath();
String inFileName = parent + "/infile.txt";
String file = read(inFileName);
From 490a25fee0a7089f0caf7a9d94f1b9104987b6c9 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Tue, 29 Nov 2016 17:02:15 +0800
Subject: [PATCH 13/62] [add] add some examples of nio
---
.../learning/java/nio/BufferToText.java | Bin 0 -> 2237 bytes
.../learning/java/nio/ChannelCopy.java | 45 ++++++++++
.../brianway/learning/java/nio/Endians.java | 36 ++++++++
.../learning/java/nio/GetChannel.java | 47 +++++++++++
.../learning/java/nio/ViewBuffers.java | 78 ++++++++++++++++++
5 files changed, 206 insertions(+)
create mode 100755 java-io/src/main/java/com/brianway/learning/java/nio/BufferToText.java
create mode 100644 java-io/src/main/java/com/brianway/learning/java/nio/ChannelCopy.java
create mode 100644 java-io/src/main/java/com/brianway/learning/java/nio/Endians.java
create mode 100644 java-io/src/main/java/com/brianway/learning/java/nio/GetChannel.java
create mode 100755 java-io/src/main/java/com/brianway/learning/java/nio/ViewBuffers.java
diff --git a/java-io/src/main/java/com/brianway/learning/java/nio/BufferToText.java b/java-io/src/main/java/com/brianway/learning/java/nio/BufferToText.java
new file mode 100755
index 0000000000000000000000000000000000000000..6d9c5d7574296bbb7a458f13a311d29828b89256
GIT binary patch
literal 2237
zcmd5-&2G~`5bilr-eKfRofOt2sw!yJOG+zophf+;fH-XIb+XjiwRYEaBLor;z>!Db
z%mpN#2Z=rhGix_-(gcdc0V`7cGduHr^L;y;^Z1gF1jKs6hDLH#@+r#%H%h7zd&93d
zQ&R7>TkTfV?Y3Lcg##nF6A28b;8%cF(A$Z6y{P|$QA8D`)s-*~vw#!V4x9$A5=f1n
zz+mdcph#0;EX78YT~2as9QcY-vm=>_XDTn;nZt4u1h69Dq;TsZ5Hy>YSz1mX<1trC
zWY$+Ys2)~_87mya2>SPp$ctenV~8_uEmSNRjPvK??^qe}~i*RjZ*#Gcp1C`A@R>~9w!?KcPgwdOf1463Oe-S1$X1HgFq+;U3H!mn~z!QbXyQaL$6k!lw|JO
z1vBupinOXb2x$!a^L+G`E+tAI)f6nGDjr6?b^%Emv(iW>!nug}g6CmyrYFK%Dj*8<
z*@m4?lLfAgGi}9ELS%G{qv5RI!7{w@W%K@qDXp-)Y8)c>pC1xFSocG6G8J
z#$eG%Zd|p9W9wy>(au$_(G;@t%r*bOy?1%7^mA}=e)O=nGdK+H;cOKASeM|;6v%W$
zh>vi9tfO&n^Lt0cbQmlc0=L&+n0tl%KJOnad|?G}FL~v1IzRkC@N=*jjn}cezeogQ
z&4%u8clH4L`dk~FHF!9n2Sg&0xqK@)Fg%Nzc11S$Od_~qu?=N})w-hBGrZY@p$vi##+n2q;#Yt`+>#zwo<
LjiPAxeY^Dw=oFTp
literal 0
HcmV?d00001
diff --git a/java-io/src/main/java/com/brianway/learning/java/nio/ChannelCopy.java b/java-io/src/main/java/com/brianway/learning/java/nio/ChannelCopy.java
new file mode 100644
index 0000000..8054ebc
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/nio/ChannelCopy.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.nio;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+/**
+ * Created by brian on 16/11/29.
+ */
+public class ChannelCopy {
+
+ private static final int BSIZE = 1024;
+
+ public static void main(String[] args) throws IOException {
+ String parent = ChannelCopy.class.getResource("/").getPath();
+ String infile = parent + "/infile.txt";
+ String outCopy = parent + "/outCopy.txt";
+ String outTransferTo = parent + "/outTransferTo.txt";
+ copy(infile, outCopy);
+ transferTo(infile, outTransferTo);
+ }
+
+ private static void copy(String infile, String outfile) throws IOException {
+ FileChannel
+ in = new FileInputStream(infile).getChannel(),
+ out = new FileOutputStream(outfile).getChannel();
+ ByteBuffer buffer = ByteBuffer.allocate(BSIZE);
+ while (in.read(buffer) != -1) {
+ buffer.flip(); // prepare for writing
+ out.write(buffer);
+ buffer.clear(); // prepare for reading
+ }
+ }
+
+ private static void transferTo(String infile, String outfile) throws IOException {
+ FileChannel
+ in = new FileInputStream(infile).getChannel(),
+ out = new FileOutputStream(outfile).getChannel();
+ in.transferTo(0, in.size(), out);
+ // Or:
+ // out.transferFrom(in,0,in.size());
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/nio/Endians.java b/java-io/src/main/java/com/brianway/learning/java/nio/Endians.java
new file mode 100644
index 0000000..f7b2404
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/nio/Endians.java
@@ -0,0 +1,36 @@
+package com.brianway.learning.java.nio;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+/**
+ * Created by brian on 16/11/29.
+ *
+ * "big endian"(高位优先),将最重要的字节放在地址最低的存储器单元;
+ * "little endian"(低位优先),将最重要的字节放在地址最高的存储器单元;
+ *
+ * ByteBuffer 是以高位优先的形式存储数据的。
+ */
+public class Endians {
+ public static void main(String[] args) {
+ ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
+ bb.asCharBuffer().put("abcdef");
+ System.out.println(Arrays.toString(bb.array()));
+
+ bb.rewind();
+ bb.order(ByteOrder.BIG_ENDIAN);
+ bb.asCharBuffer().put("abcdef");
+ System.out.println(Arrays.toString(bb.array()));
+
+ bb.rewind();
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+ bb.asCharBuffer().put("abcdef");
+ System.out.println(Arrays.toString(bb.array()));
+ }
+}
+/* Output:
+[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]
+[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102]
+[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0]
+*///:~
diff --git a/java-io/src/main/java/com/brianway/learning/java/nio/GetChannel.java b/java-io/src/main/java/com/brianway/learning/java/nio/GetChannel.java
new file mode 100644
index 0000000..9a23798
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/nio/GetChannel.java
@@ -0,0 +1,47 @@
+package com.brianway.learning.java.nio;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+/**
+ * Created by brian on 16/11/29.
+ */
+public class GetChannel {
+ private static final int BSIZE = 1024;
+
+ public static void main(String[] args) throws IOException {
+ String parent = GetChannel.class.getResource("/").getPath();
+ String filename = parent + "/data.txt";
+ write(filename);
+ addToEnd(filename);
+ read(filename);
+ }
+
+ private static void write(String filename) throws IOException {
+ FileChannel fc = new FileOutputStream(filename).getChannel();
+ fc.write(ByteBuffer.wrap("Some text ".getBytes()));
+ fc.close();
+ }
+
+ private static void addToEnd(String filename) throws IOException {
+ FileChannel fc = new RandomAccessFile(filename, "rw").getChannel();
+ fc.position(fc.size());
+ fc.write(ByteBuffer.wrap("Some more ".getBytes()));
+ fc.close();
+ }
+
+ private static void read(String filename) throws IOException {
+ FileChannel fc = new FileInputStream(filename).getChannel();
+ ByteBuffer buff = ByteBuffer.allocate(BSIZE);
+ fc.read(buff);
+ buff.flip();
+ while (buff.hasRemaining()) {
+ System.out.print((char) buff.get());
+ }
+ fc.close();
+ }
+}
diff --git a/java-io/src/main/java/com/brianway/learning/java/nio/ViewBuffers.java b/java-io/src/main/java/com/brianway/learning/java/nio/ViewBuffers.java
new file mode 100755
index 0000000..f95b2a5
--- /dev/null
+++ b/java-io/src/main/java/com/brianway/learning/java/nio/ViewBuffers.java
@@ -0,0 +1,78 @@
+package com.brianway.learning.java.nio;//: io/ViewBuffers.java
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.LongBuffer;
+import java.nio.ShortBuffer;
+
+/**
+ * Created by brian on 16/11/29.
+ *
+ * 通过在同一个 ByteBuffer 上建立不同的试图缓冲器,
+ * 将同一字节序列翻译成short,int,float,long,double等类型的数据
+ */
+
+public class ViewBuffers {
+ public static void main(String[] args) {
+ ByteBuffer bb = ByteBuffer.wrap(
+ new byte[] {0, 0, 0, 0, 0, 0, 0, 'a'});
+ bb.rewind();
+ System.out.print("Byte Buffer ");
+ while (bb.hasRemaining())
+ System.out.print(bb.position() + " -> " + bb.get() + ", ");
+ System.out.println();
+
+ CharBuffer cb =
+ ((ByteBuffer) bb.rewind()).asCharBuffer();
+ System.out.println("Char Buffer ");
+ while (cb.hasRemaining())
+ System.out.print(cb.position() + " -> " + cb.get() + ", ");
+ System.out.println();
+
+ FloatBuffer fb =
+ ((ByteBuffer) bb.rewind()).asFloatBuffer();
+ System.out.print("Float Buffer ");
+ while (fb.hasRemaining())
+ System.out.print(fb.position() + " -> " + fb.get() + ", ");
+ System.out.println();
+
+ IntBuffer ib =
+ ((ByteBuffer) bb.rewind()).asIntBuffer();
+ System.out.print("Int Buffer ");
+ while (ib.hasRemaining())
+ System.out.print(ib.position() + " -> " + ib.get() + ", ");
+ System.out.println();
+
+ LongBuffer lb =
+ ((ByteBuffer) bb.rewind()).asLongBuffer();
+ System.out.print("Long Buffer ");
+ while (lb.hasRemaining())
+ System.out.print(lb.position() + " -> " + lb.get() + ", ");
+ System.out.println();
+
+ ShortBuffer sb =
+ ((ByteBuffer) bb.rewind()).asShortBuffer();
+ System.out.print("Short Buffer ");
+ while (sb.hasRemaining())
+ System.out.print(sb.position() + " -> " + sb.get() + ", ");
+ System.out.println();
+
+ DoubleBuffer db =
+ ((ByteBuffer) bb.rewind()).asDoubleBuffer();
+ System.out.print("Double Buffer ");
+ while (db.hasRemaining())
+ System.out.print(db.position() + " -> " + db.get() + ", ");
+ }
+}
+/* Output:
+Byte Buffer 0 -> 0, 1 -> 0, 2 -> 0, 3 -> 0, 4 -> 0, 5 -> 0, 6 -> 0, 7 -> 97,
+Char Buffer 0 -> , 1 -> , 2 -> , 3 -> a,
+Float Buffer 0 -> 0.0, 1 -> 1.36E-43,
+Int Buffer 0 -> 0, 1 -> 97,
+Long Buffer 0 -> 97,
+Short Buffer 0 -> 0, 1 -> 0, 2 -> 0, 3 -> 97,
+Double Buffer 0 -> 4.8E-322,
+*///:~
From 1c2fcdc8c9d5354aaa81c36c7a836fce8654a30d Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Tue, 29 Nov 2016 17:04:35 +0800
Subject: [PATCH 14/62] [update] update README
---
README.md | 19 ++++++++++---------
.../brianway/learning/java/io/FileOutput.java | 6 +++---
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index cd387e7..9021dca 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
# 我的java学习笔记
-旨在打造在线最佳的 java 学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解 java 基础语法,想进一步深入学习的人
+旨在打造在线最佳的 Java 学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解 Java 基础语法,想进一步深入学习的人
含**博客讲解**和**源码实例**,采用 maven 构建,分模块学习,涉及反射,代理,多线程,IO,集合类等核心知识。
**如果觉得不错,请先在这个仓库上点个 star 吧**,这也是对我的肯定和鼓励,谢谢了。
-不定时进行调整和补充,需要关注更新的请 Watch、Star、Fork
+不定时进行调整和补充,需要关注更新的请 watch、star、fork
-----
@@ -16,9 +16,10 @@
**点击相应的模块能看到每个目录的说明文档**
- [blogs](/blogs):博客文档
-- [java-base](/java-base):java 基础巩固模块的 java 源码
-- [java-multithread](/java-multithread):多线程模块的 java 源码
-- [java-container](/java-container):容器类模块的 java 源码
+- [java-base](/java-base):Java 基础巩固模块的 Java 源码
+- [java-multithread](/java-multithread):多线程模块的 Java 源码
+- [java-container](/java-container):容器类模块的 Java 源码
+- [java-io](/java-io):IO 模块的 Java 源码
# 博客文档
@@ -58,12 +59,12 @@
计划将这个仓库进行重构,逐步扩充并实现下面的功能。
* [x] 整理成 maven 的结构,使用聚合和继承特性(2016.4.12完成)
-* [ ] 原有的 javase 部分代码重构为 java-base 模块,并逐步上传代码
-* [x] 多线程部分使用 java-multithread 模块(2016.4.17完成)
+* [ ] 原有的 Java SE 部分代码重构为 java-base 模块,并逐步上传代码
+* [x] 多线程部分使用 java-multithread 模块(2016.4.17完成雏形)
* [ ] 容器类部分使用模块 java-container
* [ ] IO 部分使用模块 java-io
-* [ ] java虚拟机相关部分使用模块 java-jvm
-* [ ] java 8 新特性使用模块 java8
+* [ ] Java 虚拟机相关部分使用模块 java-jvm
+* [ ] Java 8 新特性使用模块 java8
-----
diff --git a/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java b/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
index 9481ada..2c4b171 100644
--- a/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
+++ b/java-io/src/main/java/com/brianway/learning/java/io/FileOutput.java
@@ -33,7 +33,7 @@ public static void basic(String infile, String outfile) throws IOException {
/**
* 文本文件输出的快捷方式
*/
- public static void shortcut(String infile, String outfile)throws IOException{
+ public static void shortcut(String infile, String outfile) throws IOException {
BufferedReader in = new BufferedReader(
new StringReader(
BufferedInputFile.read(infile)));
@@ -54,7 +54,7 @@ public static void main(String[] args) throws IOException {
String outfile = parent + "/BasicOut";
basic(infile, outfile);
- outfile = parent+"ShortcutOut";
- shortcut(infile,outfile);
+ outfile = parent + "ShortcutOut";
+ shortcut(infile, outfile);
}
}
From 4a04b689f7e461bb7318ca5f47cad13849fab9f9 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 30 Nov 2016 20:01:12 +0800
Subject: [PATCH 15/62] [fix] rename the folder of java-multithread
---
README.md | 2 +-
java-multithread/pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 9021dca..044b571 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 我的java学习笔记
+# 我的 Java 学习笔记
旨在打造在线最佳的 Java 学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解 Java 基础语法,想进一步深入学习的人
diff --git a/java-multithread/pom.xml b/java-multithread/pom.xml
index 4757ef8..c9f06fe 100644
--- a/java-multithread/pom.xml
+++ b/java-multithread/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- java-multihread
+ java-multithread
From c0170486f5783e4882ba1977607dd7c22f4e79ca Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Thu, 1 Dec 2016 13:08:34 +0800
Subject: [PATCH 16/62] [add] add some examples of concurrency
---
.../java/concurrent/CachedThreadPool.java | 17 +++++
.../java/concurrent/CallableDemo.java | 49 ++++++++++++++
.../concurrent/CaptureUncaughtException.java | 59 +++++++++++++++++
.../java/concurrent/DaemonFromFactory.java | 30 +++++++++
.../java/concurrent/DaemonThreadFactory.java | 15 +++++
.../concurrent/DaemonsDontRunFinally.java | 37 +++++++++++
.../java/concurrent/FixedThreadPool.java | 17 +++++
.../learning/java/concurrent/Joining.java | 64 +++++++++++++++++++
.../learning/java/concurrent/LiftOff.java | 29 +++++++++
.../java/concurrent/MoreBasicThreads.java | 13 ++++
.../java/concurrent/SimpleDaemons.java | 45 +++++++++++++
.../java/concurrent/SingleThreadExecutor.java | 17 +++++
.../java/concurrent/SleepingTask.java | 30 +++++++++
.../synchronize/example13/Run13_inner01.java | 1 +
.../synchronize/example13/Run13_inner02.java | 6 ++
15 files changed, 429 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/CachedThreadPool.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/CallableDemo.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/CaptureUncaughtException.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonFromFactory.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonThreadFactory.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonsDontRunFinally.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/FixedThreadPool.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/Joining.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/LiftOff.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/MoreBasicThreads.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/SimpleDaemons.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/SingleThreadExecutor.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/concurrent/SleepingTask.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CachedThreadPool.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CachedThreadPool.java
new file mode 100644
index 0000000..5c00c5d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CachedThreadPool.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class CachedThreadPool {
+ public static void main(String[] args) {
+ ExecutorService exec = Executors.newCachedThreadPool();
+ for (int i = 0; i < 5; i++) {
+ exec.execute(new LiftOff());
+ }
+ exec.shutdown();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CallableDemo.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CallableDemo.java
new file mode 100644
index 0000000..6bf07d6
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CallableDemo.java
@@ -0,0 +1,49 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.ArrayList;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class CallableDemo {
+ public static void main(String[] args) {
+ ExecutorService exec = Executors.newCachedThreadPool();
+ ArrayList> results = new ArrayList<>();
+
+ for (int i = 0; i < 10; i++) {
+ results.add(exec.submit(new TaskWithResult(i)));
+ }
+
+ for (Future fs : results) {
+ try {
+ System.out.println(fs.get());
+ } catch (InterruptedException e) {
+ System.out.println(e);
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ System.out.println(e);
+ e.printStackTrace();
+ } finally {
+ exec.shutdown();
+ }
+ }
+ }
+}
+
+class TaskWithResult implements Callable {
+ private int id;
+
+ public TaskWithResult(int id) {
+ this.id = id;
+ }
+
+ @Override
+ public String call() throws Exception {
+ return "result of TaskWithResult " + id;
+ }
+}
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CaptureUncaughtException.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CaptureUncaughtException.java
new file mode 100755
index 0000000..07c4c60
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CaptureUncaughtException.java
@@ -0,0 +1,59 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * TODO 为什么有两个线程?
+ */
+public class CaptureUncaughtException {
+ public static void main(String[] args) {
+ ExecutorService exec = Executors.newCachedThreadPool(
+ new HandlerThreadFactory());
+ exec.execute(new ExceptionThread());
+ }
+}
+
+class ExceptionThread implements Runnable {
+ public void run() {
+ Thread t = Thread.currentThread();
+ System.out.println("run() by " + t);
+ System.out.println(
+ "eh = " + t.getUncaughtExceptionHandler());
+ throw new RuntimeException();
+ }
+}
+
+class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
+ public void uncaughtException(Thread t, Throwable e) {
+ System.out.println("caught " + e + " in " + t);
+ }
+}
+
+class HandlerThreadFactory implements ThreadFactory {
+ public Thread newThread(Runnable r) {
+ System.out.println(this + " creating new Thread");
+ Thread t = new Thread(r);
+ System.out.println("created " + t);
+ t.setUncaughtExceptionHandler(
+ new MyUncaughtExceptionHandler());
+ System.out.println(
+ "eh = " + t.getUncaughtExceptionHandler());
+ return t;
+ }
+}
+
+
+
+/* Output: (90% match)
+com.brianway.learning.java.concurrent.HandlerThreadFactory@266474c2 creating new Thread
+created Thread[Thread-0,5,main]
+eh = com.brianway.learning.java.concurrent.MyUncaughtExceptionHandler@6f94fa3e
+run() by Thread[Thread-0,5,main]
+eh = com.brianway.learning.java.concurrent.MyUncaughtExceptionHandler@6f94fa3e
+com.brianway.learning.java.concurrent.HandlerThreadFactory@266474c2 creating new Thread
+created Thread[Thread-1,5,main]
+eh = com.brianway.learning.java.concurrent.MyUncaughtExceptionHandler@3ff961b5
+caught java.lang.RuntimeException in Thread[Thread-0,5,main]
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonFromFactory.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonFromFactory.java
new file mode 100755
index 0000000..46004ff
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonFromFactory.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Using a Thread Factory to create daemons.
+ */
+public class DaemonFromFactory implements Runnable {
+ public void run() {
+ try {
+ while (true) {
+ TimeUnit.MILLISECONDS.sleep(100);
+ System.out.println(Thread.currentThread() + " " + this);
+ }
+ } catch (InterruptedException e) {
+ System.out.println("Interrupted");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ ExecutorService exec = Executors.newCachedThreadPool(
+ new DaemonThreadFactory());
+ for (int i = 0; i < 10; i++)
+ exec.execute(new DaemonFromFactory());
+ System.out.println("All daemons started");
+ TimeUnit.MILLISECONDS.sleep(500); // Run for a while
+ }
+} /* (Execute to see output) *///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonThreadFactory.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonThreadFactory.java
new file mode 100644
index 0000000..506f98b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonThreadFactory.java
@@ -0,0 +1,15 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * Created by brian on 16/12/1.
+ */
+public class DaemonThreadFactory implements ThreadFactory {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setDaemon(true);
+ return t;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonsDontRunFinally.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonsDontRunFinally.java
new file mode 100755
index 0000000..86de25b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonsDontRunFinally.java
@@ -0,0 +1,37 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Daemon threads don't run the finally clause
+ *
+ * output:"Starting ADaemon" or nothing
+ */
+
+public class DaemonsDontRunFinally {
+ public static void main(String[] args) throws Exception {
+ Thread t = new Thread(new ADaemon());
+ t.setDaemon(true);
+ t.start();
+ }
+}
+
+class ADaemon implements Runnable {
+ public void run() {
+ try {
+ System.out.println("Starting ADaemon");
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ System.out.println("Exiting via InterruptedException");
+ } finally {
+ System.out.println("This should always run?");
+ }
+ }
+}
+/* Output:
+Starting ADaemon
+
+or
+
+output nothing
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/FixedThreadPool.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/FixedThreadPool.java
new file mode 100644
index 0000000..fe9f063
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/FixedThreadPool.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class FixedThreadPool {
+ public static void main(String[] args) {
+ ExecutorService exec = Executors.newFixedThreadPool(5);
+ for (int i = 0; i < 5; i++) {
+ exec.execute(new LiftOff());
+ }
+ exec.shutdown();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/Joining.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/Joining.java
new file mode 100755
index 0000000..a3e5532
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/Joining.java
@@ -0,0 +1,64 @@
+package com.brianway.learning.java.concurrent;
+
+/**
+ * Understanding join().
+ *
+ * 异常捕获时将清理标志位
+ */
+class Sleeper extends Thread {
+ private int duration;
+
+ public Sleeper(String name, int sleepTime) {
+ super(name);
+ duration = sleepTime;
+ start();
+ }
+
+ public void run() {
+ try {
+ sleep(duration);
+ } catch (InterruptedException e) {
+ System.out.println(getName() + " was interrupted. " +
+ "isInterrupted(): " + isInterrupted());
+ return;
+ }
+ System.out.println(getName() + " has awakened");
+ }
+}
+
+class Joiner extends Thread {
+ private Sleeper sleeper;
+
+ public Joiner(String name, Sleeper sleeper) {
+ super(name);
+ this.sleeper = sleeper;
+ start();
+ }
+
+ public void run() {
+ try {
+ sleeper.join();
+ } catch (InterruptedException e) {
+ System.out.println("Interrupted");
+ }
+ System.out.println(getName() + " join completed");
+ }
+}
+
+public class Joining {
+ public static void main(String[] args) {
+ Sleeper
+ sleepy = new Sleeper("Sleepy", 1500),
+ grumpy = new Sleeper("Grumpy", 1500);
+ Joiner
+ dopey = new Joiner("Dopey", sleepy),
+ doc = new Joiner("Doc", grumpy);
+ grumpy.interrupt();
+ }
+}
+/* Output:
+Grumpy was interrupted. isInterrupted(): false
+Doc join completed
+Sleepy has awakened
+Dopey join completed
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/LiftOff.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/LiftOff.java
new file mode 100644
index 0000000..c42f9cf
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/LiftOff.java
@@ -0,0 +1,29 @@
+package com.brianway.learning.java.concurrent;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class LiftOff implements Runnable {
+ protected int countDown = 10;
+ private static int taskCount = 0;
+ private final int id = taskCount++;
+
+ public LiftOff() {
+ }
+
+ public LiftOff(int countDown) {
+ this.countDown = countDown;
+ }
+
+ public String status() {
+ return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + "), ";
+ }
+
+ @Override
+ public void run() {
+ while (countDown-- > 0) {
+ System.out.print(status());
+ Thread.yield();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/MoreBasicThreads.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/MoreBasicThreads.java
new file mode 100644
index 0000000..0aec425
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/MoreBasicThreads.java
@@ -0,0 +1,13 @@
+package com.brianway.learning.java.concurrent;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class MoreBasicThreads {
+ public static void main(String[] args) {
+ for (int i = 0; i < 5; i++) {
+ new Thread(new LiftOff()).start();
+ }
+ System.out.println("Waiting for LiftOff");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SimpleDaemons.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SimpleDaemons.java
new file mode 100755
index 0000000..6a6d477
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SimpleDaemons.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Daemon threads don't prevent the program from ending.
+ */
+public class SimpleDaemons implements Runnable {
+ public void run() {
+ try {
+ while (true) {
+ TimeUnit.MILLISECONDS.sleep(100);
+ System.out.println(Thread.currentThread() + " " + this);
+ }
+ } catch (InterruptedException e) {
+ System.out.println("sleep() interrupted");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ for (int i = 0; i < 10; i++) {
+ Thread daemon = new Thread(new SimpleDaemons());
+ daemon.setDaemon(true); // Must call before start()
+ daemon.start();
+ }
+ System.out.println("All daemons started");
+ TimeUnit.MILLISECONDS.sleep(175);
+ }
+}
+
+/* Output: (Sample)
+All daemons started
+Thread[Thread-8,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@1ec8f532
+Thread[Thread-4,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@17d10736
+Thread[Thread-1,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@2eec0173
+Thread[Thread-0,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@78f0e569
+Thread[Thread-5,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@572f3b73
+Thread[Thread-6,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@6c8d15b7
+Thread[Thread-2,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@31229a57
+Thread[Thread-3,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@4059e324
+Thread[Thread-9,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@32e39829
+Thread[Thread-7,5,main] com.brianway.learning.java.concurrent.SimpleDaemons@45401023
+
+...
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SingleThreadExecutor.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SingleThreadExecutor.java
new file mode 100644
index 0000000..dc70e5c
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SingleThreadExecutor.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class SingleThreadExecutor {
+ public static void main(String[] args) {
+ ExecutorService exec = Executors.newSingleThreadExecutor();
+ for (int i = 0; i < 5; i++) {
+ exec.execute(new LiftOff());
+ }
+ exec.shutdown();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SleepingTask.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SleepingTask.java
new file mode 100644
index 0000000..b53f1f4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SleepingTask.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by brian on 16/11/30.
+ */
+public class SleepingTask extends LiftOff {
+ @Override
+ public void run() {
+ try {
+ while (countDown-- > 0) {
+ System.out.print(status());
+ TimeUnit.MILLISECONDS.sleep(100);
+ }
+ } catch (InterruptedException e) {
+ System.err.println("Interrupted");
+ }
+ }
+
+ public static void main(String[] args) {
+ ExecutorService exec = Executors.newCachedThreadPool();
+ for (int i = 0; i < 5; i++) {
+ exec.execute(new SleepingTask());
+ }
+ exec.shutdown();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
index 8e3b8c2..21bbe0c 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
@@ -6,6 +6,7 @@
* P112
* 内置类和同步测试1
*/
+
import com.brianway.learning.java.multithread.synchronize.example13.OutClass.Inner;
public class Run13_inner01 {
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
index d2e9630..b93a5b7 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
@@ -8,6 +8,12 @@
*
* T1和T3竞争in2的锁。只有T1结束,T3才能开始;或者T3结束,T1才能开始
* T2与另外两个没关系,因为其锁对象是in2
+ *
+ * P112
+ * 内置类与同步测试2
+ *
+ * T1和T3竞争in2的锁。只有T1结束,T3才能开始;或者T3结束,T1才能开始
+ * T2与另外两个没关系,因为其锁对象是in2
*/
/**
From 50a4d82300fd834e6b4c7864b29cfe95ebe5c490 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Thu, 1 Dec 2016 20:06:59 +0800
Subject: [PATCH 17/62] [add] add some examples of concurrency,especially
BlockingQueue
---
.../java/concurrent/CloseResource.java | 43 +++++
.../java/concurrent/Interrupting.java | 106 +++++++++++
.../java/concurrent/InterruptingIdiom.java | 83 +++++++++
.../java/concurrent/OrnamentalGarden.java | 101 ++++++++++
.../learning/java/concurrent/PipedIO.java | 71 +++++++
.../java/concurrent/TestBlockingQueues.java | 77 ++++++++
.../learning/java/concurrent/ToastOMatic.java | 174 ++++++++++++++++++
7 files changed, 655 insertions(+)
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/CloseResource.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/Interrupting.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/InterruptingIdiom.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/OrnamentalGarden.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/PipedIO.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/TestBlockingQueues.java
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/ToastOMatic.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CloseResource.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CloseResource.java
new file mode 100755
index 0000000..7a5ded2
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CloseResource.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.concurrent;
+
+import java.io.InputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Interrupting a blocked task by closing the underlying resource.
+ * {RunByHand}
+ */
+public class CloseResource {
+ public static void main(String[] args) throws Exception {
+ ExecutorService exec = Executors.newCachedThreadPool();
+ ServerSocket server = new ServerSocket(8080);
+ InputStream socketInput =
+ new Socket("localhost", 8080).getInputStream();
+ exec.execute(new IOBlocked(socketInput));
+ exec.execute(new IOBlocked(System.in));
+ TimeUnit.MILLISECONDS.sleep(100);
+ System.out.println("Shutting down all threads");
+ exec.shutdownNow();
+ TimeUnit.SECONDS.sleep(1);
+ System.out.println("Closing " + socketInput.getClass().getName());
+ socketInput.close(); // Releases blocked thread
+ TimeUnit.SECONDS.sleep(1);
+ System.out.println("Closing " + System.in.getClass().getName());
+ System.in.close(); // Releases blocked thread
+ }
+}
+
+/* Output: (85% match)
+Waiting for read():
+Waiting for read():
+Shutting down all threads
+Closing java.net.SocketInputStream
+Interrupted from blocked I/O
+Exiting IOBlocked.run()
+Closing java.io.BufferedInputStream
+Exiting IOBlocked.run()
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/Interrupting.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/Interrupting.java
new file mode 100755
index 0000000..1118727
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/Interrupting.java
@@ -0,0 +1,106 @@
+package com.brianway.learning.java.concurrent;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Interrupting a blocked thread.
+ *
+ *
+ */
+public class Interrupting {
+ private static ExecutorService exec =
+ Executors.newCachedThreadPool();
+
+ static void test(Runnable r) throws InterruptedException {
+ Future> f = exec.submit(r);
+ TimeUnit.MILLISECONDS.sleep(100);
+ System.out.println("Interrupting " + r.getClass().getSimpleName());
+ f.cancel(true); // Interrupts if running
+ System.out.println("Interrupt sent to " + r.getClass().getSimpleName());
+ }
+
+ public static void main(String[] args) throws Exception {
+ test(new SleepBlocked());
+ test(new IOBlocked(System.in));
+ test(new SynchronizedBlocked());
+ TimeUnit.SECONDS.sleep(3);
+ System.out.println("Aborting with System.exit(0)");
+ System.exit(0); // ... since last 2 interrupts failed
+ }
+}
+
+/**
+ * 可中断的阻塞示例
+ */
+class SleepBlocked implements Runnable {
+ public void run() {
+ try {
+ TimeUnit.SECONDS.sleep(100);
+ } catch (InterruptedException e) {
+ System.out.println("InterruptedException");
+ }
+ System.out.println("Exiting SleepBlocked.run()");
+ }
+}
+
+class IOBlocked implements Runnable {
+ private InputStream in;
+
+ public IOBlocked(InputStream is) {
+ in = is;
+ }
+
+ public void run() {
+ try {
+ System.out.println("Waiting for read():");
+ in.read();
+ } catch (IOException e) {
+ if (Thread.currentThread().isInterrupted()) {
+ System.out.println("Interrupted from blocked I/O");
+ } else {
+ throw new RuntimeException(e);
+ }
+ }
+ System.out.println("Exiting IOBlocked.run()");
+ }
+}
+
+class SynchronizedBlocked implements Runnable {
+ public synchronized void f() {
+ while (true) // Never releases lock
+ Thread.yield();
+ }
+
+ public SynchronizedBlocked() {
+ new Thread() {
+ public void run() {
+ f(); // Lock acquired by this thread
+ }
+ }.start();
+ }
+
+ public void run() {
+ System.out.println("Trying to call f()");
+ f();
+ System.out.println("Exiting SynchronizedBlocked.run()");
+ }
+}
+
+/* Output: (95% match)
+Interrupting SleepBlocked
+Interrupt sent to SleepBlocked
+InterruptedException
+Exiting SleepBlocked.run()
+Waiting for read():
+Interrupting IOBlocked
+Interrupt sent to IOBlocked
+Trying to call f()
+Interrupting SynchronizedBlocked
+Interrupt sent to SynchronizedBlocked
+Aborting with System.exit(0)
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/InterruptingIdiom.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/InterruptingIdiom.java
new file mode 100755
index 0000000..208db8d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/InterruptingIdiom.java
@@ -0,0 +1,83 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * General idiom for interrupting a task.
+ * {Args: 1100}
+ */
+public class InterruptingIdiom {
+ public static void main(String[] args) throws Exception {
+ if (args.length != 1) {
+ System.out.println("usage: java InterruptingIdiom delay-in-mS");
+ System.exit(1);
+ }
+ Thread t = new Thread(new Blocked3());
+ t.start();
+ TimeUnit.MILLISECONDS.sleep(new Integer(args[0]));
+ t.interrupt();
+ }
+}
+
+class NeedsCleanup {
+ private final int id;
+
+ public NeedsCleanup(int ident) {
+ id = ident;
+ System.out.println("NeedsCleanup " + id);
+ }
+
+ public void cleanup() {
+ System.out.println("Cleaning up " + id);
+ }
+}
+
+class Blocked3 implements Runnable {
+ private volatile double d = 0.0;
+
+ public void run() {
+ try {
+ while (!Thread.interrupted()) {
+ // point1
+ NeedsCleanup n1 = new NeedsCleanup(1);
+ // Start try-finally immediately after definition
+ // of n1, to guarantee proper cleanup of n1:
+ try {
+ System.out.println("Sleeping");
+ TimeUnit.SECONDS.sleep(1);
+ // point2
+ NeedsCleanup n2 = new NeedsCleanup(2);
+ // Guarantee proper cleanup of n2:
+ try {
+ System.out.println("Calculating");
+ // A time-consuming, non-blocking operation:
+ for (int i = 1; i < 2500000; i++)
+ d = d + (Math.PI + Math.E) / d;
+ System.out.println("Finished time-consuming operation");
+ } finally {
+ n2.cleanup();
+ }
+ } finally {
+ n1.cleanup();
+ }
+ }
+ System.out.println("Exiting via while() test");
+ } catch (InterruptedException e) {
+ System.out.println("Exiting via InterruptedException");
+ }
+ }
+}
+
+/* Output: (Sample)
+NeedsCleanup 1
+Sleeping
+NeedsCleanup 2
+Calculating
+Finished time-consuming operation
+Cleaning up 2
+Cleaning up 1
+NeedsCleanup 1
+Sleeping
+Cleaning up 1
+Exiting via InterruptedException
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/OrnamentalGarden.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/OrnamentalGarden.java
new file mode 100755
index 0000000..11a0eca
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/OrnamentalGarden.java
@@ -0,0 +1,101 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+class Count {
+ private int count = 0;
+ private Random rand = new Random(47);
+
+ // Remove the synchronized keyword to see counting fail:
+ public synchronized int increment() {
+ int temp = count;
+ if (rand.nextBoolean()) // Yield half the time
+ {
+ Thread.yield();
+ }
+ return (count = ++temp);
+ }
+
+ public synchronized int value() {
+ return count;
+ }
+}
+
+class Entrance implements Runnable {
+ private static Count count = new Count();
+ private static List entrances =
+ new ArrayList();
+ private int number = 0;
+ // Doesn't need synchronization to read:
+ private final int id;
+ private static volatile boolean canceled = false;
+
+ // Atomic operation on a volatile field:
+ public static void cancel() {
+ canceled = true;
+ }
+
+ public Entrance(int id) {
+ this.id = id;
+ // Keep this task in a list. Also prevents
+ // garbage collection of dead tasks:
+ entrances.add(this);
+ }
+
+ public void run() {
+ while (!canceled) {
+ synchronized (this) {
+ ++number;
+ }
+ System.out.println(this + " Total: " + count.increment());
+ try {
+ TimeUnit.MILLISECONDS.sleep(100);
+ } catch (InterruptedException e) {
+ System.out.println("sleep interrupted");
+ }
+ }
+ System.out.println("Stopping " + this);
+ }
+
+ public synchronized int getValue() {
+ return number;
+ }
+
+ public String toString() {
+ return "Entrance " + id + ": " + getValue();
+ }
+
+ public static int getTotalCount() {
+ return count.value();
+ }
+
+ public static int sumEntrances() {
+ int sum = 0;
+ for (Entrance entrance : entrances)
+ sum += entrance.getValue();
+ return sum;
+ }
+}
+
+public class OrnamentalGarden {
+ public static void main(String[] args) throws Exception {
+ ExecutorService exec = Executors.newCachedThreadPool();
+ for (int i = 0; i < 5; i++)
+ exec.execute(new Entrance(i));
+ // Run for a while, then stop and collect the data:
+ TimeUnit.SECONDS.sleep(3);
+ Entrance.cancel();
+ exec.shutdown();
+ if (!exec.awaitTermination(250, TimeUnit.MILLISECONDS)) {
+ System.out.println("Some tasks were not terminated!");
+ }
+ System.out.println("Total: " + Entrance.getTotalCount());
+ System.out.println("Sum of Entrances: " + Entrance.sumEntrances());
+ }
+}
+
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/PipedIO.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/PipedIO.java
new file mode 100755
index 0000000..b21de44
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/PipedIO.java
@@ -0,0 +1,71 @@
+package com.brianway.learning.java.concurrent;
+
+import java.io.IOException;
+import java.io.PipedReader;
+import java.io.PipedWriter;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Using pipes for inter-task I/O
+ */
+public class PipedIO {
+ public static void main(String[] args) throws Exception {
+ Sender sender = new Sender();
+ Receiver receiver = new Receiver(sender);
+ ExecutorService exec = Executors.newCachedThreadPool();
+ exec.execute(sender);
+ exec.execute(receiver);
+ TimeUnit.SECONDS.sleep(4);
+ exec.shutdownNow();
+ }
+}
+
+class Sender implements Runnable {
+ private Random rand = new Random(47);
+ private PipedWriter out = new PipedWriter();
+
+ public PipedWriter getPipedWriter() {
+ return out;
+ }
+
+ public void run() {
+ try {
+ while (true)
+ for (char c = 'A'; c <= 'z'; c++) {
+ out.write(c);
+ TimeUnit.MILLISECONDS.sleep(rand.nextInt(500));
+ }
+ } catch (IOException e) {
+ System.out.println(e + " Sender write exception");
+ } catch (InterruptedException e) {
+ System.out.println(e + " Sender sleep interrupted");
+ }
+ }
+}
+
+class Receiver implements Runnable {
+ private PipedReader in;
+
+ public Receiver(Sender sender) throws IOException {
+ in = new PipedReader(sender.getPipedWriter());
+ }
+
+ public void run() {
+ try {
+ while (true) {
+ // Blocks until characters are there:
+ System.out.print("Read: " + (char) in.read() + ", ");
+ }
+ } catch (IOException e) {
+ System.out.println(e + " Receiver read exception");
+ }
+ }
+}
+
+/* Output: (65% match)
+Read: A, Read: B, Read: C, Read: D, Read: E, Read: F, Read: G, Read: H, Read: I, Read: J, Read: K, Read: L, Read: M, java.lang.InterruptedException: sleep interrupted Sender sleep interrupted
+java.io.InterruptedIOException Receiver read exception
+*///:~
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/TestBlockingQueues.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/TestBlockingQueues.java
new file mode 100755
index 0000000..9591ad7
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/TestBlockingQueues.java
@@ -0,0 +1,77 @@
+package com.brianway.learning.java.concurrent;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.SynchronousQueue;
+
+public class TestBlockingQueues {
+ static void getkey() {
+ try {
+ // Compensate for Windows/Linux difference in the
+ // length of the result produced by the Enter key:
+ new BufferedReader(
+ new InputStreamReader(System.in)).readLine();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ static void getkey(String message) {
+ System.out.println(message);
+ getkey();
+ }
+
+ static void test(String msg, BlockingQueue queue) {
+ System.out.println(msg);
+ LiftOffRunner runner = new LiftOffRunner(queue);
+ Thread t = new Thread(runner);
+ t.start();
+ for (int i = 0; i < 5; i++) {
+ runner.add(new LiftOff(5));
+ }
+ getkey("Press 'Enter' (" + msg + ")");
+ t.interrupt();
+ System.out.println("Finished " + msg + " test");
+ }
+
+ public static void main(String[] args) {
+ test("LinkedBlockingQueue", // Unlimited size
+ new LinkedBlockingQueue());
+ test("ArrayBlockingQueue", // Fixed size
+ new ArrayBlockingQueue(3));
+ test("SynchronousQueue", // Size of 1
+ new SynchronousQueue());
+ }
+}
+
+class LiftOffRunner implements Runnable {
+ private BlockingQueue rockets;
+
+ public LiftOffRunner(BlockingQueue queue) {
+ rockets = queue;
+ }
+
+ public void add(LiftOff lo) {
+ try {
+ rockets.put(lo);
+ } catch (InterruptedException e) {
+ System.out.println("Interrupted during put()");
+ }
+ }
+
+ public void run() {
+ try {
+ while (!Thread.interrupted()) {
+ LiftOff rocket = rockets.take();
+ rocket.run(); // Use this thread
+ }
+ } catch (InterruptedException e) {
+ System.out.println("Waking from take()");
+ }
+ System.out.println("Exiting LiftOffRunner");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/ToastOMatic.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/ToastOMatic.java
new file mode 100755
index 0000000..021668a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/ToastOMatic.java
@@ -0,0 +1,174 @@
+package com.brianway.learning.java.concurrent;
+
+/**
+ * A toaster that uses queues.
+ */
+
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class ToastOMatic {
+ public static void main(String[] args) throws Exception {
+ ToastQueue dryQueue = new ToastQueue(),
+ butteredQueue = new ToastQueue(),
+ finishedQueue = new ToastQueue();
+ ExecutorService exec = Executors.newCachedThreadPool();
+ exec.execute(new Toaster(dryQueue));
+ exec.execute(new Butterer(dryQueue, butteredQueue));
+ exec.execute(new Jammer(butteredQueue, finishedQueue));
+ exec.execute(new Eater(finishedQueue));
+ TimeUnit.SECONDS.sleep(5);
+ exec.shutdownNow();
+ }
+}
+
+class Toast {
+ public enum Status {
+ DRY,
+ BUTTERED,
+ JAMMED
+ }
+
+ private Status status = Status.DRY;
+ private final int id;
+
+ public Toast(int idn) {
+ id = idn;
+ }
+
+ public void butter() {
+ status = Status.BUTTERED;
+ }
+
+ public void jam() {
+ status = Status.JAMMED;
+ }
+
+ public Status getStatus() {
+ return status;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String toString() {
+ return "Toast " + id + ": " + status;
+ }
+}
+
+class ToastQueue extends LinkedBlockingQueue {
+}
+
+class Toaster implements Runnable {
+ private ToastQueue toastQueue;
+ private int count = 0;
+ private Random rand = new Random(47);
+
+ public Toaster(ToastQueue tq) {
+ toastQueue = tq;
+ }
+
+ public void run() {
+ try {
+ while (!Thread.interrupted()) {
+ TimeUnit.MILLISECONDS.sleep(
+ 100 + rand.nextInt(500));
+ // Make toast
+ Toast t = new Toast(count++);
+ System.out.println(t);
+ // Insert into queue
+ toastQueue.put(t);
+ }
+ } catch (InterruptedException e) {
+ System.out.println("Toaster interrupted");
+ }
+ System.out.println("Toaster off");
+ }
+}
+
+// Apply butter to toast:
+class Butterer implements Runnable {
+ private ToastQueue dryQueue, butteredQueue;
+
+ public Butterer(ToastQueue dry, ToastQueue buttered) {
+ dryQueue = dry;
+ butteredQueue = buttered;
+ }
+
+ public void run() {
+ try {
+ while (!Thread.interrupted()) {
+ // Blocks until next piece of toast is available:
+ Toast t = dryQueue.take();
+ t.butter();
+ System.out.println(t);
+ butteredQueue.put(t);
+ }
+ } catch (InterruptedException e) {
+ System.out.println("Butterer interrupted");
+ }
+ System.out.println("Butterer off");
+ }
+}
+
+// Apply jam to buttered toast:
+class Jammer implements Runnable {
+ private ToastQueue butteredQueue, finishedQueue;
+
+ public Jammer(ToastQueue buttered, ToastQueue finished) {
+ butteredQueue = buttered;
+ finishedQueue = finished;
+ }
+
+ public void run() {
+ try {
+ while (!Thread.interrupted()) {
+ // Blocks until next piece of toast is available:
+ Toast t = butteredQueue.take();
+ t.jam();
+ System.out.println(t);
+ finishedQueue.put(t);
+ }
+ } catch (InterruptedException e) {
+ System.out.println("Jammer interrupted");
+ }
+ System.out.println("Jammer off");
+ }
+}
+
+// Consume the toast:
+class Eater implements Runnable {
+ private ToastQueue finishedQueue;
+ private int counter = 0;
+
+ public Eater(ToastQueue finished) {
+ finishedQueue = finished;
+ }
+
+ public void run() {
+ try {
+ while (!Thread.interrupted()) {
+ // Blocks until next piece of toast is available:
+ Toast t = finishedQueue.take();
+ // Verify that the toast is coming in order,
+ // and that all pieces are getting jammed:
+ if (t.getId() != counter++ ||
+ t.getStatus() != Toast.Status.JAMMED) {
+ System.out.println(">>>> Error: " + t);
+ System.exit(1);
+ } else {
+ System.out.println("Chomp! " + t);
+ }
+ }
+ } catch (InterruptedException e) {
+ System.out.println("Eater interrupted");
+ }
+ System.out.println("Eater off");
+ }
+}
+
+/* (Execute to see output) *///:~
From b1bdbe144b9e08f46f7b31e7b5f3c810f39cf9d8 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Tue, 6 Dec 2016 20:15:37 +0800
Subject: [PATCH 18/62] [add] add CountDownLatch example
---
.../java/concurrent/CountDownLatchDemo.java | 81 +++++++++++++++++++
1 file changed, 81 insertions(+)
create mode 100755 java-multithread/src/main/java/com/brianway/learning/java/concurrent/CountDownLatchDemo.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CountDownLatchDemo.java b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CountDownLatchDemo.java
new file mode 100755
index 0000000..5c3fcf9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CountDownLatchDemo.java
@@ -0,0 +1,81 @@
+package com.brianway.learning.java.concurrent;
+
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+public class CountDownLatchDemo {
+ static final int SIZE = 10;
+
+ public static void main(String[] args) throws Exception {
+ ExecutorService exec = Executors.newCachedThreadPool();
+ // All must share a single CountDownLatch object:
+ CountDownLatch latch = new CountDownLatch(SIZE);
+ for (int i = 0; i < 10; i++)
+ exec.execute(new WaitingTask(latch));
+ for (int i = 0; i < SIZE; i++)
+ exec.execute(new TaskPortion(latch));
+ System.out.println("Launched all tasks");
+ exec.shutdown(); // Quit when all tasks complete
+ }
+}
+
+// Performs some portion of a task:
+class TaskPortion implements Runnable {
+ private static int counter = 0;
+ private final int id = counter++;
+ private static Random rand = new Random(47);
+ private final CountDownLatch latch;
+
+ TaskPortion(CountDownLatch latch) {
+ this.latch = latch;
+ }
+
+ public void run() {
+ try {
+ doWork();
+ latch.countDown();
+ latch.await();
+ System.out.println(this + " TaskPortion after await");
+ } catch (InterruptedException ex) {
+ // Acceptable way to exit
+ }
+ }
+
+ public void doWork() throws InterruptedException {
+ TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));
+ System.out.println(this + "completed");
+ }
+
+ public String toString() {
+ return String.format("%1$-3d ", id);
+ }
+}
+
+// Waits on the CountDownLatch:
+class WaitingTask implements Runnable {
+ private static int counter = 0;
+ private final int id = counter++;
+ private final CountDownLatch latch;
+
+ WaitingTask(CountDownLatch latch) {
+ this.latch = latch;
+ }
+
+ public void run() {
+ try {
+ latch.await();
+ System.out.println("Latch barrier passed for " + this);
+ } catch (InterruptedException ex) {
+ System.out.println(this + " interrupted");
+ }
+ }
+
+ public String toString() {
+ return String.format("WaitingTask %1$-3d ", id);
+ }
+}
+
+/* (Execute to see output) *///:~
From 3dafe096675cecb392555d4d74c2b78af5546285 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 7 Dec 2016 16:18:44 +0800
Subject: [PATCH 19/62] [add] add examples of type info
---
.../base/typeinfo/BoundedClassReferences.java | 10 +++
.../java/base/typeinfo/ClassCasts.java | 33 ++++++++++
.../base/typeinfo/ClassInitialization.java | 64 +++++++++++++++++++
.../java/base/typeinfo/FamilyVsExactType.java | 54 ++++++++++++++++
.../java/base/typeinfo/FilledList.java | 41 ++++++++++++
.../base/typeinfo/GenericClassReferences.java | 15 +++++
.../base/typeinfo/SimpleDynamicProxy.java | 52 +++++++++++++++
.../java/base/typeinfo/SimpleProxyDemo.java | 56 ++++++++++++++++
.../typeinfo/WildcardClassReferences.java | 8 +++
9 files changed, 333 insertions(+)
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/BoundedClassReferences.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassCasts.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassInitialization.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FamilyVsExactType.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FilledList.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/GenericClassReferences.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleDynamicProxy.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleProxyDemo.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/typeinfo/WildcardClassReferences.java
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/BoundedClassReferences.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/BoundedClassReferences.java
new file mode 100755
index 0000000..c5e7d6f
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/BoundedClassReferences.java
@@ -0,0 +1,10 @@
+package com.brianway.learning.java.base.typeinfo;
+
+public class BoundedClassReferences {
+ public static void main(String[] args) {
+ Class extends Number> bounded = int.class;
+ bounded = double.class;
+ bounded = Number.class;
+ // Or anything else derived from Number.
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassCasts.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassCasts.java
new file mode 100755
index 0000000..da64ce4
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassCasts.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.base.typeinfo;
+
+class Building {
+}
+
+class House extends Building {
+}
+
+public class ClassCasts {
+ public static void main(String[] args) {
+ Building b = new House();
+ Class houseType = House.class;
+ House h = houseType.cast(b);
+ h = (House) b; // ... or just do this.
+
+ try {
+ Class hClass = House.class;
+ //Produces exact type
+ House house = hClass.newInstance();
+ Class super House> up = hClass.getSuperclass();
+ // won't compile:
+ //Class up2 = hClass.getSuperclass();
+
+ //Only produces Object
+ Object obj = up.newInstance();
+
+ System.out.println(house);
+ System.out.println(obj);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassInitialization.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassInitialization.java
new file mode 100755
index 0000000..0703121
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/ClassInitialization.java
@@ -0,0 +1,64 @@
+package com.brianway.learning.java.base.typeinfo;
+
+import java.util.Random;
+
+/**
+ * 1.仅使用.class语法来获得对类的引用不会引发初始化
+ * 2."编译器常量",无需类初始化即可读取
+ * 3.static final域不一定是编译器常量,static非final域一定不是
+ */
+public class ClassInitialization {
+ public static Random rand = new Random(47);
+
+ public static void main(String[] args) throws Exception {
+ Class initable = Initable.class;
+ System.out.println("After creating Initable ref");
+ // Does not trigger initialization:
+ System.out.println(Initable.staticFinal);
+ // Does trigger initialization:
+ System.out.println(Initable.staticFinal2);
+ // Does trigger initialization:
+ System.out.println(Initable2.staticNonFinal);
+ Class initable3 = Class.forName("com.brianway.learning.java.base.typeinfo.Initable3");
+ System.out.println("After creating Initable3 ref");
+ System.out.println(Initable3.staticNonFinal);
+ }
+}
+
+class Initable {
+ static final int staticFinal = 47;
+ static final int staticFinal2 =
+ ClassInitialization.rand.nextInt(1000);
+
+ static {
+ System.out.println("Initializing Initable");
+ }
+}
+
+class Initable2 {
+ static int staticNonFinal = 147;
+
+ static {
+ System.out.println("Initializing Initable2");
+ }
+}
+
+class Initable3 {
+ static int staticNonFinal = 74;
+
+ static {
+ System.out.println("Initializing Initable3");
+ }
+}
+
+/* Output:
+After creating Initable ref
+47
+Initializing Initable
+258
+Initializing Initable2
+147
+Initializing Initable3
+After creating Initable3 ref
+74
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FamilyVsExactType.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FamilyVsExactType.java
new file mode 100755
index 0000000..5547fde
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FamilyVsExactType.java
@@ -0,0 +1,54 @@
+package com.brianway.learning.java.base.typeinfo;
+
+/**
+ * The difference between instanceof and class.
+ */
+public class FamilyVsExactType {
+ static void test(Object x) {
+ System.out.println("Testing x of type " + x.getClass());
+ System.out.println("x instanceof Base " + (x instanceof Base));
+ System.out.println("x instanceof Derived " + (x instanceof Derived));
+ System.out.println("Base.isInstance(x) " + Base.class.isInstance(x));
+ System.out.println("Derived.isInstance(x) "
+ + Derived.class.isInstance(x));
+ System.out.println("x.getClass() == Base.class "
+ + (x.getClass() == Base.class));
+ System.out.println("x.getClass() == Derived.class "
+ + (x.getClass() == Derived.class));
+ System.out.println("x.getClass().equals(Base.class)) "
+ + (x.getClass().equals(Base.class)));
+ System.out.println("x.getClass().equals(Derived.class)) "
+ + (x.getClass().equals(Derived.class)));
+ }
+
+ public static void main(String[] args) {
+ test(new Base());
+ test(new Derived());
+ }
+}
+
+class Base {
+}
+
+class Derived extends Base {
+}
+/* Output:
+Testing x of type class typeinfo.Base
+x instanceof Base true
+x instanceof Derived false
+Base.isInstance(x) true
+Derived.isInstance(x) false
+x.getClass() == Base.class true
+x.getClass() == Derived.class false
+x.getClass().equals(Base.class)) true
+x.getClass().equals(Derived.class)) false
+Testing x of type class typeinfo.Derived
+x instanceof Base true
+x instanceof Derived true
+Base.isInstance(x) true
+Derived.isInstance(x) true
+x.getClass() == Base.class false
+x.getClass() == Derived.class true
+x.getClass().equals(Base.class)) false
+x.getClass().equals(Derived.class)) true
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FilledList.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FilledList.java
new file mode 100755
index 0000000..437f452
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/FilledList.java
@@ -0,0 +1,41 @@
+package com.brianway.learning.java.base.typeinfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class CountedInteger {
+ private static long counter;
+ private final long id = counter++;
+
+ public String toString() {
+ return Long.toString(id);
+ }
+}
+
+public class FilledList {
+ private Class type;
+
+ public FilledList(Class type) {
+ this.type = type;
+ }
+
+ public List create(int nElements) {
+ List result = new ArrayList();
+ try {
+ for (int i = 0; i < nElements; i++)
+ result.add(type.newInstance());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return result;
+ }
+
+ public static void main(String[] args) {
+ FilledList fl =
+ new FilledList(CountedInteger.class);
+ System.out.println(fl.create(15));
+ }
+}
+/* Output:
+[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/GenericClassReferences.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/GenericClassReferences.java
new file mode 100755
index 0000000..23e0718
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/GenericClassReferences.java
@@ -0,0 +1,15 @@
+package com.brianway.learning.java.base.typeinfo;
+
+public class GenericClassReferences {
+ public static void main(String[] args) {
+
+ Class genericIntClass = int.class;
+ genericIntClass = Integer.class; // Same thing
+
+ Class intClass = int.class;
+ intClass = double.class;
+ // genericIntClass = double.class; // Illegal
+
+ System.out.println(int.class == Integer.class);
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleDynamicProxy.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleDynamicProxy.java
new file mode 100755
index 0000000..7b44a9e
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleDynamicProxy.java
@@ -0,0 +1,52 @@
+package com.brianway.learning.java.base.typeinfo;//: typeinfo/SimpleDynamicProxy.java
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+class DynamicProxyHandler implements InvocationHandler {
+ private Object proxied;
+
+ public DynamicProxyHandler(Object proxied) {
+ this.proxied = proxied;
+ }
+
+ public Object
+ invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ System.out.println("**** proxy: " + proxy.getClass().getSimpleName() +
+ ", method: " + method + ", args: " + args);
+ if (args != null) {
+ for (Object arg : args)
+ System.out.println(" " + arg);
+ }
+ return method.invoke(proxied, args);
+ }
+}
+
+class SimpleDynamicProxy {
+ public static void consumer(Interface iface) {
+ iface.doSomething();
+ iface.somethingElse("bonobo");
+ }
+
+ public static void main(String[] args) {
+ RealObject real = new RealObject();
+ consumer(real);
+ // Insert a proxy and call again:
+ Interface proxy = (Interface) Proxy.newProxyInstance(
+ Interface.class.getClassLoader(),
+ new Class[] {Interface.class},
+ new DynamicProxyHandler(real));
+ consumer(proxy);
+ }
+}
+/* Output: (95% match)
+doSomething
+somethingElse bonobo
+**** proxy: $Proxy0, method: public abstract void com.brianway.learning.java.base.typeinfo.Interface.doSomething(), args: null
+doSomething
+**** proxy: $Proxy0, method: public abstract void com.brianway.learning.java.base.typeinfo.Interface.somethingElse(java.lang.String), args: [Ljava.lang.Object;@d716361
+ bonobo
+somethingElse bonobo
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleProxyDemo.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleProxyDemo.java
new file mode 100755
index 0000000..7047cb0
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/SimpleProxyDemo.java
@@ -0,0 +1,56 @@
+package com.brianway.learning.java.base.typeinfo;
+
+interface Interface {
+ void doSomething();
+
+ void somethingElse(String arg);
+}
+
+class RealObject implements Interface {
+ public void doSomething() {
+ System.out.println("doSomething");
+ }
+
+ public void somethingElse(String arg) {
+ System.out.println("somethingElse " + arg);
+ }
+}
+
+class SimpleProxy implements Interface {
+ private Interface proxied;
+
+ public SimpleProxy(Interface proxied) {
+ this.proxied = proxied;
+ }
+
+ public void doSomething() {
+ System.out.println("SimpleProxy doSomething");
+ proxied.doSomething();
+ }
+
+ public void somethingElse(String arg) {
+ System.out.println("SimpleProxy somethingElse " + arg);
+ proxied.somethingElse(arg);
+ }
+}
+
+class SimpleProxyDemo {
+ public static void consumer(Interface iface) {
+ iface.doSomething();
+ iface.somethingElse("bonobo");
+ }
+
+ public static void main(String[] args) {
+ consumer(new RealObject());
+ consumer(new SimpleProxy(new RealObject()));
+ }
+}
+
+/* Output:
+doSomething
+somethingElse bonobo
+SimpleProxy doSomething
+doSomething
+SimpleProxy somethingElse bonobo
+somethingElse bonobo
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/WildcardClassReferences.java b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/WildcardClassReferences.java
new file mode 100755
index 0000000..cca198a
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/WildcardClassReferences.java
@@ -0,0 +1,8 @@
+package com.brianway.learning.java.base.typeinfo;
+
+public class WildcardClassReferences {
+ public static void main(String[] args) {
+ Class> intClass = int.class;
+ intClass = double.class;
+ }
+} ///:~
From d3e2afadcb7a5630a07472f16cf80aca0d9debd6 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 7 Dec 2016 23:59:40 +0800
Subject: [PATCH 20/62] [add] add examples of generics
---
.../java/base/generics/ArrayMaker.java | 30 ++++
.../java/base/generics/BasicBounds.java | 118 ++++++++++++++++
.../java/base/generics/ClassTypeCapture.java | 47 +++++++
.../java/base/generics/CovariantArrays.java | 42 ++++++
.../java/base/generics/CreatorGeneric.java | 38 +++++
.../base/generics/ErasedTypeEquivalence.java | 17 +++
.../java/base/generics/FactoryConstraint.java | 39 ++++++
.../java/base/generics/GenericArray.java | 35 +++++
.../java/base/generics/GenericArray2.java | 41 ++++++
.../generics/GenericArrayWithTypeToken.java | 33 +++++
.../java/base/generics/GenericMethods.java | 28 ++++
.../java/base/generics/GenericReading.java | 53 +++++++
.../java/base/generics/GenericVarargs.java | 30 ++++
.../java/base/generics/GenericWriting.java | 36 +++++
.../base/generics/GenericsAndCovariance.java | 21 +++
.../learning/java/base/generics/Holder.java | 47 +++++++
.../java/base/generics/InheritBounds.java | 65 +++++++++
.../base/generics/InstantiateGenericType.java | 35 +++++
.../java/base/generics/LinkedStack.java | 52 +++++++
.../java/base/generics/LostInformation.java | 43 ++++++
.../base/generics/SuperTypeWildcards.java | 20 +++
.../java/base/generics/Wildcards.java | 130 ++++++++++++++++++
22 files changed, 1000 insertions(+)
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/ArrayMaker.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/BasicBounds.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/ClassTypeCapture.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/CovariantArrays.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/CreatorGeneric.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/ErasedTypeEquivalence.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/FactoryConstraint.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray2.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArrayWithTypeToken.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericMethods.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericReading.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericVarargs.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericWriting.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/GenericsAndCovariance.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/Holder.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/InheritBounds.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/InstantiateGenericType.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/LinkedStack.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/LostInformation.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/SuperTypeWildcards.java
create mode 100755 java-base/src/main/java/com/brianway/learning/java/base/generics/Wildcards.java
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/ArrayMaker.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/ArrayMaker.java
new file mode 100755
index 0000000..9045c41
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/ArrayMaker.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.base.generics;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+
+/**
+ * 对于泛型中创建数组,使用Array.newInstance()是推荐的方式
+ */
+public class ArrayMaker {
+ private Class kind;
+
+ public ArrayMaker(Class kind) {
+ this.kind = kind;
+ }
+
+ @SuppressWarnings("unchecked")
+ T[] create(int size) {
+ return (T[]) Array.newInstance(kind, size);
+ }
+
+ public static void main(String[] args) {
+ ArrayMaker stringMaker =
+ new ArrayMaker(String.class);
+ String[] stringArray = stringMaker.create(9);
+ System.out.println(Arrays.toString(stringArray));
+ }
+}
+/* Output:
+[null, null, null, null, null, null, null, null, null]
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/BasicBounds.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/BasicBounds.java
new file mode 100755
index 0000000..7e37d06
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/BasicBounds.java
@@ -0,0 +1,118 @@
+package com.brianway.learning.java.base.generics;
+
+public class BasicBounds {
+ public static void main(String[] args) {
+ Solid solid =
+ new Solid(new Bounded());
+ solid.color();
+ solid.getY();
+ solid.weight();
+ }
+}
+
+interface HasColor {
+ java.awt.Color getColor();
+}
+
+class Colored {
+ T item;
+
+ Colored(T item) {
+ this.item = item;
+ }
+
+ T getItem() {
+ return item;
+ }
+
+ // The bound allows you to call a method:
+ java.awt.Color color() {
+ return item.getColor();
+ }
+}
+
+class Dimension {
+ public int x, y, z;
+}
+
+// This won't work -- class must be first, then interfaces:
+// class ColoredDimension {
+
+// Multiple bounds:
+class ColoredDimension {
+ T item;
+
+ ColoredDimension(T item) {
+ this.item = item;
+ }
+
+ T getItem() {
+ return item;
+ }
+
+ java.awt.Color color() {
+ return item.getColor();
+ }
+
+ int getX() {
+ return item.x;
+ }
+
+ int getY() {
+ return item.y;
+ }
+
+ int getZ() {
+ return item.z;
+ }
+}
+
+interface Weight {
+ int weight();
+}
+
+// As with inheritance, you can have only one
+// concrete class but multiple interfaces:
+class Solid {
+ T item;
+
+ Solid(T item) {
+ this.item = item;
+ }
+
+ T getItem() {
+ return item;
+ }
+
+ java.awt.Color color() {
+ return item.getColor();
+ }
+
+ int getX() {
+ return item.x;
+ }
+
+ int getY() {
+ return item.y;
+ }
+
+ int getZ() {
+ return item.z;
+ }
+
+ int weight() {
+ return item.weight();
+ }
+}
+
+class Bounded
+ extends Dimension implements HasColor, Weight {
+ public java.awt.Color getColor() {
+ return null;
+ }
+
+ public int weight() {
+ return 0;
+ }
+}
+///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/ClassTypeCapture.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/ClassTypeCapture.java
new file mode 100755
index 0000000..4af0aaa
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/ClassTypeCapture.java
@@ -0,0 +1,47 @@
+package com.brianway.learning.java.base.generics;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 擦除的补偿
+ * 显式传递类型的 Class 对象
+ */
+public class ClassTypeCapture {
+ //类型标签
+ Class kind;
+
+ Map> types = new HashMap<>();
+
+ public ClassTypeCapture(Class kind) {
+ this.kind = kind;
+ }
+
+ public boolean f(Object arg) {
+ return kind.isInstance(arg);
+ }
+
+ public static void main(String[] args) {
+ ClassTypeCapture ctt1 =
+ new ClassTypeCapture(Building.class);
+ System.out.println(ctt1.f(new Building()));
+ System.out.println(ctt1.f(new House()));
+ ClassTypeCapture ctt2 =
+ new ClassTypeCapture(House.class);
+ System.out.println(ctt2.f(new Building()));
+ System.out.println(ctt2.f(new House()));
+ }
+}
+
+class Building {
+}
+
+class House extends Building {
+}
+
+/* Output:
+true
+true
+false
+true
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/CovariantArrays.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/CovariantArrays.java
new file mode 100755
index 0000000..ce639a2
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/CovariantArrays.java
@@ -0,0 +1,42 @@
+package com.brianway.learning.java.base.generics;
+
+/**
+ * 通配符相关类的基础类
+ */
+public class CovariantArrays {
+ public static void main(String[] args) {
+ Fruit[] fruit = new Apple[10];
+ fruit[0] = new Apple(); // OK
+ fruit[1] = new Jonathan(); // OK
+ // Runtime type is Apple[], not Fruit[] or Orange[]:
+ try {
+ // Compiler allows you to add Fruit:
+ fruit[0] = new Fruit(); // ArrayStoreException
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ try {
+ // Compiler allows you to add Oranges:
+ fruit[0] = new Orange(); // ArrayStoreException
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ }
+}
+
+class Fruit {
+}
+
+class Apple extends Fruit {
+}
+
+class Jonathan extends Apple {
+}
+
+class Orange extends Fruit {
+}
+
+/* Output:
+java.lang.ArrayStoreException: Fruit
+java.lang.ArrayStoreException: Orange
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/CreatorGeneric.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/CreatorGeneric.java
new file mode 100755
index 0000000..8ccbcf1
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/CreatorGeneric.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.base.generics;
+
+/**
+ * 末班方法设计模式
+ */
+public class CreatorGeneric {
+ public static void main(String[] args) {
+ Creator c = new Creator();
+ c.f();
+ }
+}
+
+abstract class GenericWithCreate {
+ final T element;
+
+ GenericWithCreate() {
+ element = create();
+ }
+
+ abstract T create();
+}
+
+class X {
+}
+
+class Creator extends GenericWithCreate {
+ X create() {
+ return new X();
+ }
+
+ void f() {
+ System.out.println(element.getClass().getSimpleName());
+ }
+}
+
+/* Output:
+X
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/ErasedTypeEquivalence.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/ErasedTypeEquivalence.java
new file mode 100755
index 0000000..0050950
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/ErasedTypeEquivalence.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.base.generics;
+
+import java.util.ArrayList;
+
+public class ErasedTypeEquivalence {
+ public static void main(String[] args) {
+ Class c1 = new ArrayList().getClass();
+ Class c2 = new ArrayList().getClass();
+ Class c3 = ArrayList.class;
+ System.out.println(c1 == c2);
+ System.out.println(c1 == c3);
+ }
+}
+/* Output:
+true
+true
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/FactoryConstraint.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/FactoryConstraint.java
new file mode 100755
index 0000000..a53f978
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/FactoryConstraint.java
@@ -0,0 +1,39 @@
+package com.brianway.learning.java.base.generics;//: generics/FactoryConstraint.java
+
+/**
+ * 显式工厂
+ */
+public class FactoryConstraint {
+ public static void main(String[] args) {
+ new Foo2(new IntegerFactory());
+ new Foo2(new Widget.Factory());
+ }
+}
+
+interface FactoryI {
+ T create();
+}
+
+class Foo2 {
+ private T x;
+
+ public > Foo2(F factory) {
+ x = factory.create();
+ }
+
+}
+
+class IntegerFactory implements FactoryI {
+ public Integer create() {
+ return 0;
+ }
+}
+
+class Widget {
+ public static class Factory implements FactoryI {
+ public Widget create() {
+ return new Widget();
+ }
+ }
+}
+///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray.java
new file mode 100755
index 0000000..b9273fc
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray.java
@@ -0,0 +1,35 @@
+package com.brianway.learning.java.base.generics;//: generics/GenericArray.java
+
+/**
+ * 泛型数组
+ */
+public class GenericArray {
+ private T[] array;
+
+ @SuppressWarnings("unchecked")
+ public GenericArray(int sz) {
+ array = (T[]) new Object[sz];
+ }
+
+ public void put(int index, T item) {
+ array[index] = item;
+ }
+
+ public T get(int index) {
+ return array[index];
+ }
+
+ // Method that exposes the underlying representation:
+ public T[] rep() {
+ return array;
+ }
+
+ public static void main(String[] args) {
+ GenericArray gai =
+ new GenericArray(10);
+ // This causes a ClassCastException:
+ //! Integer[] ia = gai.rep();
+ // This is OK:
+ Object[] oa = gai.rep();
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray2.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray2.java
new file mode 100755
index 0000000..21ea014
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray2.java
@@ -0,0 +1,41 @@
+package com.brianway.learning.java.base.generics;
+
+public class GenericArray2 {
+ private Object[] array;
+
+ public GenericArray2(int sz) {
+ array = new Object[sz];
+ }
+
+ public void put(int index, T item) {
+ array[index] = item;
+ }
+
+ @SuppressWarnings("unchecked")
+ public T get(int index) {
+ return (T) array[index];
+ }
+
+ @SuppressWarnings("unchecked")
+ public T[] rep() {
+ return (T[]) array; // Warning: unchecked cast
+ }
+
+ public static void main(String[] args) {
+ GenericArray2 gai =
+ new GenericArray2(10);
+ for (int i = 0; i < 10; i++)
+ gai.put(i, i);
+ for (int i = 0; i < 10; i++)
+ System.out.print(gai.get(i) + " ");
+ System.out.println();
+ try {
+ Integer[] ia = gai.rep();
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ }
+} /* Output: (Sample)
+0 1 2 3 4 5 6 7 8 9
+java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArrayWithTypeToken.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArrayWithTypeToken.java
new file mode 100755
index 0000000..cafbe61
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArrayWithTypeToken.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.base.generics;
+
+import java.lang.reflect.Array;
+
+public class GenericArrayWithTypeToken {
+ private T[] array;
+
+ @SuppressWarnings("unchecked")
+ public GenericArrayWithTypeToken(Class type, int sz) {
+ array = (T[]) Array.newInstance(type, sz);
+ }
+
+ public void put(int index, T item) {
+ array[index] = item;
+ }
+
+ public T get(int index) {
+ return array[index];
+ }
+
+ // Expose the underlying representation:
+ public T[] rep() {
+ return array;
+ }
+
+ public static void main(String[] args) {
+ GenericArrayWithTypeToken gai =
+ new GenericArrayWithTypeToken(
+ Integer.class, 10);
+ // This now works:
+ Integer[] ia = gai.rep();
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericMethods.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericMethods.java
new file mode 100755
index 0000000..715c204
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericMethods.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java.base.generics;
+
+/**
+ * 泛型方法
+ */
+public class GenericMethods {
+ public void f(T x) {
+ System.out.println(x.getClass().getName());
+ }
+
+ public static void main(String[] args) {
+ GenericMethods gm = new GenericMethods();
+ gm.f("");
+ gm.f(1);
+ gm.f(1.0);
+ gm.f(1.0F);
+ gm.f('c');
+ gm.f(gm);
+ }
+}
+/* Output:
+java.lang.String
+java.lang.Integer
+java.lang.Double
+java.lang.Float
+java.lang.Character
+GenericMethods
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericReading.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericReading.java
new file mode 100755
index 0000000..dafc7c0
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericReading.java
@@ -0,0 +1,53 @@
+package com.brianway.learning.java.base.generics;//: generics/GenericReading.java
+
+import java.util.Arrays;
+import java.util.List;
+
+public class GenericReading {
+ static T readExact(List list) {
+ return list.get(0);
+ }
+
+ static List apples = Arrays.asList(new Apple());
+ static List fruit = Arrays.asList(new Fruit());
+
+ // A static method adapts to each call:
+ static void f1() {
+ Apple a = readExact(apples);
+ Fruit f = readExact(fruit);
+ f = readExact(apples);
+ }
+
+ // If, however, you have a class, then its type is
+ // established when the class is instantiated:
+ static class Reader {
+ T readExact(List list) {
+ return list.get(0);
+ }
+ }
+
+ static void f2() {
+ Reader fruitReader = new Reader();
+ Fruit f = fruitReader.readExact(fruit);
+ // Fruit a = fruitReader.readExact(apples); // Error:
+ // readExact(List) cannot be
+ // applied to (List).
+ }
+
+ static class CovariantReader {
+ T readCovariant(List extends T> list) {
+ return list.get(0);
+ }
+ }
+
+ static void f3() {
+ CovariantReader fruitReader =
+ new CovariantReader();
+ Fruit f = fruitReader.readCovariant(fruit);
+ Fruit a = fruitReader.readCovariant(apples);
+ }
+
+ public static void main(String[] args) {
+ f1(); f2(); f3();
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericVarargs.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericVarargs.java
new file mode 100755
index 0000000..1a64c5b
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericVarargs.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.base.generics;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 可变参数与泛型方法
+ */
+public class GenericVarargs {
+ public static List makeList(T... args) {
+ List result = new ArrayList();
+ for (T item : args)
+ result.add(item);
+ return result;
+ }
+
+ public static void main(String[] args) {
+ List ls = makeList("A");
+ System.out.println(ls);
+ ls = makeList("A", "B", "C");
+ System.out.println(ls);
+ ls = makeList("ABCDEFFHIJKLMNOPQRSTUVWXYZ".split(""));
+ System.out.println(ls);
+ }
+}
+/* Output:
+[A]
+[A, B, C]
+[, A, B, C, D, E, F, F, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericWriting.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericWriting.java
new file mode 100755
index 0000000..ac9e9d6
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericWriting.java
@@ -0,0 +1,36 @@
+package com.brianway.learning.java.base.generics;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GenericWriting {
+ // 使用确切参数类型
+ static void writeExact(List list, T item) {
+ list.add(item);
+ }
+
+ static List apples = new ArrayList();
+ static List fruit = new ArrayList();
+
+ static void f1() {
+ writeExact(apples, new Apple());
+ // writeExact(fruit, new Apple()); // Error:
+ // Incompatible types: found Fruit, required Apple
+ }
+
+ //
+ static void
+ writeWithWildcard(List super T> list, T item) {
+ list.add(item);
+ }
+
+ static void f2() {
+ writeWithWildcard(apples, new Apple());
+ writeWithWildcard(fruit, new Apple());
+ }
+
+ public static void main(String[] args) {
+ f1();
+ f2();
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericsAndCovariance.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericsAndCovariance.java
new file mode 100755
index 0000000..5c9722d
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericsAndCovariance.java
@@ -0,0 +1,21 @@
+package com.brianway.learning.java.base.generics;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ */
+public class GenericsAndCovariance {
+ public static void main(String[] args) {
+ // Wildcards allow covariance:
+ List extends Fruit> flist = new ArrayList();
+ // Compile Error: can't add any type of object:
+ // flist.add(new Apple());
+ // flist.add(new Fruit());
+ // flist.add(new Object());
+ flist.add(null); // Legal but uninteresting
+ // We know that it returns at least Fruit:
+ Fruit f = flist.get(0);
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/Holder.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/Holder.java
new file mode 100755
index 0000000..70c2387
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/Holder.java
@@ -0,0 +1,47 @@
+package com.brianway.learning.java.base.generics;
+
+
+public class Holder {
+ private T value;
+
+ public Holder() {
+ }
+
+ public Holder(T val) {
+ value = val;
+ }
+
+ public void set(T val) {
+ value = val;
+ }
+
+ public T get() {
+ return value;
+ }
+
+ public boolean equals(Object obj) {
+ return value.equals(obj);
+ }
+
+ public static void main(String[] args) {
+ Holder Apple = new Holder(new Apple());
+ Apple d = Apple.get();
+ Apple.set(d);
+ // Holder Fruit = Apple; // Cannot upcast
+ Holder extends Fruit> fruit = Apple; // OK
+ Fruit p = fruit.get();
+ d = (Apple) fruit.get(); // Returns 'Object'
+ try {
+ Orange c = (Orange) fruit.get(); // No warning
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ // fruit.set(new Apple()); // Cannot call set()
+ // fruit.set(new Fruit()); // Cannot call set()
+ System.out.println(fruit.equals(d)); // OK
+ }
+}
+/* Output: (Sample)
+java.lang.ClassCastException: com.brianway.learning.java.base.generics.Apple cannot be cast to com.brianway.learning.java.base.generics.Orange
+true
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/InheritBounds.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/InheritBounds.java
new file mode 100755
index 0000000..4995479
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/InheritBounds.java
@@ -0,0 +1,65 @@
+package com.brianway.learning.java.base.generics;
+
+public class InheritBounds {
+ public static void main(String[] args) {
+ Solid2 solid2 =
+ new Solid2(new Bounded());
+ solid2.color();
+ solid2.getY();
+ solid2.weight();
+ }
+}
+
+class HoldItem {
+ T item;
+
+ HoldItem(T item) {
+ this.item = item;
+ }
+
+ T getItem() {
+ return item;
+ }
+}
+
+class Colored2 extends HoldItem {
+ Colored2(T item) {
+ super(item);
+ }
+
+ java.awt.Color color() {
+ return item.getColor();
+ }
+}
+
+class ColoredDimension2
+ extends Colored2 {
+ ColoredDimension2(T item) {
+ super(item);
+ }
+
+ int getX() {
+ return item.x;
+ }
+
+ int getY() {
+ return item.y;
+ }
+
+ int getZ() {
+ return item.z;
+ }
+}
+
+class Solid2
+ extends ColoredDimension2 {
+ Solid2(T item) {
+ super(item);
+ }
+
+ int weight() {
+ return item.weight();
+ }
+}
+
+///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/InstantiateGenericType.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/InstantiateGenericType.java
new file mode 100755
index 0000000..c7bd90f
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/InstantiateGenericType.java
@@ -0,0 +1,35 @@
+package com.brianway.learning.java.base.generics;
+
+public class InstantiateGenericType {
+ public static void main(String[] args) {
+ ClassAsFactory fe =
+ new ClassAsFactory(Employee.class);
+ System.out.println("ClassAsFactory succeeded");
+ try {
+ ClassAsFactory fi =
+ new ClassAsFactory(Integer.class);
+ } catch (Exception e) {
+ System.out.println("ClassAsFactory failed");
+ }
+ }
+}
+
+class ClassAsFactory {
+ T x;
+
+ public ClassAsFactory(Class kind) {
+ try {
+ x = kind.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
+
+class Employee {
+}
+
+/* Output:
+ClassAsFactory succeeded
+ClassAsFactory failed
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/LinkedStack.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/LinkedStack.java
new file mode 100755
index 0000000..c58ea6c
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/LinkedStack.java
@@ -0,0 +1,52 @@
+package com.brianway.learning.java.base.generics;
+
+/**
+ * A stack implemented with an internal linked structure.
+ */
+public class LinkedStack {
+ private static class Node {
+ U item;
+ Node next;
+
+ Node() {
+ item = null; next = null;
+ }
+
+ Node(U item, Node next) {
+ this.item = item;
+ this.next = next;
+ }
+
+ boolean end() {
+ return item == null && next == null;
+ }
+ }
+
+ private Node top = new Node(); // End sentinel
+
+ public void push(T item) {
+ top = new Node(item, top);
+ }
+
+ public T pop() {
+ T result = top.item;
+ if (!top.end()) {
+ top = top.next;
+ }
+ return result;
+ }
+
+ public static void main(String[] args) {
+ LinkedStack lss = new LinkedStack();
+ for (String s : "Phasers on stun!".split(" "))
+ lss.push(s);
+ String s;
+ while ((s = lss.pop()) != null)
+ System.out.println(s);
+ }
+}
+/* Output:
+stun!
+on
+Phasers
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/LostInformation.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/LostInformation.java
new file mode 100755
index 0000000..617a224
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/LostInformation.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.base.generics;//: generics/LostInformation.java
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class LostInformation {
+ public static void main(String[] args) {
+ List list = new ArrayList();
+ Map map = new HashMap();
+ Quark quark = new Quark();
+ Particle p = new Particle();
+ System.out.println(Arrays.toString(
+ list.getClass().getTypeParameters()));
+ System.out.println(Arrays.toString(
+ map.getClass().getTypeParameters()));
+ System.out.println(Arrays.toString(
+ quark.getClass().getTypeParameters()));
+ System.out.println(Arrays.toString(
+ p.getClass().getTypeParameters()));
+ }
+}
+
+class Frob {
+}
+
+class Fnorkle {
+}
+
+class Quark {
+}
+
+class Particle {
+}
+
+/* Output:
+[E]
+[K, V]
+[Q]
+[POSITION, MOMENTUM]
+*///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/SuperTypeWildcards.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/SuperTypeWildcards.java
new file mode 100755
index 0000000..fc4f031
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/SuperTypeWildcards.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.base.generics;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 逆变
+ * 超类型通配符
+ */
+public class SuperTypeWildcards {
+ static void writeTo(List super Apple> apples) {
+ apples.add(new Apple());
+ apples.add(new Jonathan());
+ // apples.add(new Fruit()); // Error
+ }
+
+ public static void main(String[] args) {
+ SuperTypeWildcards.writeTo(new ArrayList());
+ }
+} ///:~
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/generics/Wildcards.java b/java-base/src/main/java/com/brianway/learning/java/base/generics/Wildcards.java
new file mode 100755
index 0000000..6618fdb
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/generics/Wildcards.java
@@ -0,0 +1,130 @@
+package com.brianway.learning.java.base.generics;
+
+/**
+ * Exploring the meaning of wildcards.
+ */
+public class Wildcards {
+ // Raw argument:
+ static void rawArgs(Holder holder, Object arg) {
+ // holder.set(arg); // Warning:
+ // Unchecked call to set(T) as a
+ // member of the raw type Holder
+ // holder.set(new Wildcards()); // Same warning
+
+ // Can't do this; don't have any 'T':
+ // T t = holder.get();
+
+ // OK, but type information has been lost:
+ Object obj = holder.get();
+ }
+
+ // Similar to rawArgs(), but errors instead of warnings:
+ static void unboundedArg(Holder> holder, Object arg) {
+ // holder.set(arg); // Error:
+ // set(capture of ?) in Holder
+ // cannot be applied to (Object)
+ // holder.set(new Wildcards()); // Same error
+
+ // Can't do this; don't have any 'T':
+ // T t = holder.get();
+
+ // OK, but type information has been lost:
+ Object obj = holder.get();
+ }
+
+ static T exact1(Holder holder) {
+ T t = holder.get();
+ return t;
+ }
+
+ static T exact2(Holder holder, T arg) {
+ holder.set(arg);
+ T t = holder.get();
+ return t;
+ }
+
+ static
+ T wildSubtype(Holder extends T> holder, T arg) {
+ // holder.set(arg); // Error:
+ // set(capture of ? extends T) in
+ // Holder
+ // cannot be applied to (T)
+ T t = holder.get();
+ return t;
+ }
+
+ static
+ void wildSupertype(Holder super T> holder, T arg) {
+ holder.set(arg);
+ // T t = holder.get(); // Error:
+ // Incompatible types: found Object, required T
+
+ // OK, but type information has been lost:
+ Object obj = holder.get();
+ }
+
+ public static void main(String[] args) {
+ Holder raw = new Holder();
+ // Or:
+ raw = new Holder();
+ Holder qualified = new Holder();
+ Holder> unbounded = new Holder();
+ Holder extends Long> bounded = new Holder();
+ Long lng = 1L;
+
+ rawArgs(raw, lng);
+ rawArgs(qualified, lng);
+ rawArgs(unbounded, lng);
+ rawArgs(bounded, lng);
+
+ unboundedArg(raw, lng);
+ unboundedArg(qualified, lng);
+ unboundedArg(unbounded, lng);
+ unboundedArg(bounded, lng);
+
+ // Object r1 = exact1(raw); // Warnings:
+ // Unchecked conversion from Holder to Holder
+ // Unchecked method invocation: exact1(Holder)
+ // is applied to (Holder)
+ Long r2 = exact1(qualified);
+ Object r3 = exact1(unbounded); // Must return Object
+ Long r4 = exact1(bounded);
+
+ // Long r5 = exact2(raw, lng); // Warnings:
+ // Unchecked conversion from Holder to Holder
+ // Unchecked method invocation: exact2(Holder,T)
+ // is applied to (Holder,Long)
+ Long r6 = exact2(qualified, lng);
+ // Long r7 = exact2(unbounded, lng); // Error:
+ // exact2(Holder,T) cannot be applied to
+ // (Holder,Long)
+ // Long r8 = exact2(bounded, lng); // Error:
+ // exact2(Holder,T) cannot be applied
+ // to (Holder,Long)
+
+ // Long r9 = wildSubtype(raw, lng); // Warnings:
+ // Unchecked conversion from Holder
+ // to Holder extends Long>
+ // Unchecked method invocation:
+ // wildSubtype(Holder extends T>,T) is
+ // applied to (Holder,Long)
+ Long r10 = wildSubtype(qualified, lng);
+ // OK, but can only return Object:
+ Object r11 = wildSubtype(unbounded, lng);
+ Long r12 = wildSubtype(bounded, lng);
+
+ // wildSupertype(raw, lng); // Warnings:
+ // Unchecked conversion from Holder
+ // to Holder super Long>
+ // Unchecked method invocation:
+ // wildSupertype(Holder super T>,T)
+ // is applied to (Holder,Long)
+ wildSupertype(qualified, lng);
+ // wildSupertype(unbounded, lng); // Error:
+ // wildSupertype(Holder super T>,T) cannot be
+ // applied to (Holder,Long)
+ // wildSupertype(bounded, lng); // Error:
+ // wildSupertype(Holder super T>,T) cannot be
+ // applied to (Holder,Long)
+ }
+} ///:~
From 2bd399ce267e5013e8209c64027e1493249c86fb Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Mon, 26 Dec 2016 23:09:28 +0800
Subject: [PATCH 21/62] [add] add module java8
---
java8/pom.xml | 14 ++++
.../java8/lambda/FilteringApples.java | 81 +++++++++++++++++++
pom.xml | 3 +
3 files changed, 98 insertions(+)
create mode 100644 java8/pom.xml
create mode 100644 java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
diff --git a/java8/pom.xml b/java8/pom.xml
new file mode 100644
index 0000000..9428faf
--- /dev/null
+++ b/java8/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ java-learning
+ com.brianway.learning.java
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ java8
+
+
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
new file mode 100644
index 0000000..a06bdf1
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
@@ -0,0 +1,81 @@
+package com.brianway.learning.java8.lambda;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * Created by brian on 16/12/26.
+ */
+public class FilteringApples {
+ public static void main(String[] args) {
+ List inventory = Arrays.asList(new Apple(80, "green"),
+ new Apple(155, "green"),
+ new Apple(120, "red"));
+
+ List greenApples = filter(inventory, FilteringApples::isGreenApple);
+ System.out.println(greenApples);
+
+ List greenApples2 = filter(inventory, (Apple a) -> "green".equals(a.getColor()));
+ System.out.println(greenApples2);
+
+ List heavyApples = filter(inventory, FilteringApples::isHeavyApple);
+ System.out.println(heavyApples);
+
+ List heavyApples2 = filter(inventory, (Apple a) -> a.getWeight() > 150);
+ System.out.println(heavyApples2);
+
+ }
+
+ public static List filter(List inventory, Predicate p) {
+ List result = new ArrayList<>();
+ for (Apple apple : inventory) {
+ if (p.test(apple)) {
+ result.add(apple);
+ }
+ }
+ return result;
+ }
+
+ public static boolean isGreenApple(Apple apple) {
+ return "green".equals(apple.getColor());
+ }
+
+ public static boolean isHeavyApple(Apple apple) {
+ return apple.getWeight() > 150;
+ }
+
+ public static class Apple {
+ private int weight = 0;
+ private String color = "";
+
+ public Apple(int weight, String color) {
+ this.weight = weight;
+ this.color = color;
+ }
+
+ public Integer getWeight() {
+ return weight;
+ }
+
+ public void setWeight(Integer weight) {
+ this.weight = weight;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String toString() {
+ return "Apple{" +
+ "color='" + color + '\'' +
+ ", weight=" + weight +
+ '}';
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index 5bf3a88..551090f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,8 @@
UTF-8
UTF-8
+ 1.8
+ 1.8
4.11
@@ -48,6 +50,7 @@
java-base
java-container
java-io
+ java8
From dec218074be1ec3f0f1785d3a109a28f65153f6b Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Thu, 29 Dec 2016 00:21:03 +0800
Subject: [PATCH 22/62] [add] add Stream API examples
---
java8/README.md | 6 ++
.../java8/streamapi/BuildingStreams.java | 80 +++++++++++++++++
.../learning/java8/streamapi/Dish.java | 57 +++++++++++++
.../java8/streamapi/GroupingTransactions.java | 84 ++++++++++++++++++
.../java8/streamapi/PuttingIntoPractice.java | 85 +++++++++++++++++++
.../learning/java8/streamapi/StreamBasic.java | 50 +++++++++++
.../learning/java8/streamapi/Trader.java | 28 ++++++
.../learning/java8/streamapi/Transaction.java | 32 +++++++
java8/src/main/resources/data-building.txt | 2 +
9 files changed, 424 insertions(+)
create mode 100644 java8/README.md
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java
create mode 100644 java8/src/main/resources/data-building.txt
diff --git a/java8/README.md b/java8/README.md
new file mode 100644
index 0000000..f645ce7
--- /dev/null
+++ b/java8/README.md
@@ -0,0 +1,6 @@
+# Java 8 新特性
+
+《Java 8 In Action》一书
+
+源码参考了 **java8/Java8InAction**:[https://github.com/java8/Java8InAction](https://github.com/java8/Java8InAction)
+
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
new file mode 100644
index 0000000..1dc21ba
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
@@ -0,0 +1,80 @@
+package com.brianway.learning.java8.streamapi;
+
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.function.IntSupplier;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class BuildingStreams {
+
+ public static void main(String... args) throws Exception {
+
+ // Stream.of
+ Stream stream = Stream.of("Java 8", "Lambdas", "In", "Action");
+ stream.map(String::toUpperCase).forEach(System.out::println);
+
+ // Stream.empty
+ Stream emptyStream = Stream.empty();
+
+ // Arrays.stream
+ int[] numbers = {2, 3, 5, 7, 11, 13};
+ System.out.println(Arrays.stream(numbers).sum());
+
+ // Stream.iterate
+ Stream.iterate(0, n -> n + 2)
+ .limit(10)
+ .forEach(System.out::println);
+
+ // fibonnaci with iterate
+ Stream.iterate(new int[] {0, 1}, t -> new int[] {t[1], t[0] + t[1]})
+ .limit(10)
+ .forEach(t -> System.out.println("(" + t[0] + ", " + t[1] + ")"));
+
+ Stream.iterate(new int[] {0, 1}, t -> new int[] {t[1], t[0] + t[1]})
+ .limit(10)
+ .map(t -> t[0])
+ .forEach(System.out::println);
+
+ // random stream of doubles with Stream.generate
+ Stream.generate(Math::random)
+ .limit(10)
+ .forEach(System.out::println);
+
+ // stream of 1s with Stream.generate
+ IntStream.generate(() -> 1)
+ .limit(5)
+ .forEach(System.out::println);
+
+ IntStream.generate(new IntSupplier() {
+ public int getAsInt() {
+ return 2;
+ }
+ }).limit(5)
+ .forEach(System.out::println);
+
+ IntSupplier fib = new IntSupplier() {
+ private int previous = 0;
+ private int current = 1;
+
+ public int getAsInt() {
+ int nextValue = this.previous + this.current;
+ this.previous = this.current;
+ this.current = nextValue;
+ return this.previous;
+ }
+ };
+ IntStream.generate(fib).limit(10).forEach(System.out::println);
+
+ String path = BuildingStreams.class.getResource("/").getPath() + "/data-building.txt";
+ long uniqueWords = Files.lines(Paths.get(path), Charset.defaultCharset())
+ .flatMap(line -> Arrays.stream(line.split(" ")))
+ .distinct()
+ .count();
+
+ System.out.println("There are " + uniqueWords + " unique words in data.txt");
+
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java
new file mode 100644
index 0000000..5c74596
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java
@@ -0,0 +1,57 @@
+package com.brianway.learning.java8.streamapi;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Dish {
+
+ private final String name;
+ private final boolean vegetarian;
+ private final int calories;
+ private final Type type;
+
+ public Dish(String name, boolean vegetarian, int calories, Type type) {
+ this.name = name;
+ this.vegetarian = vegetarian;
+ this.calories = calories;
+ this.type = type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean isVegetarian() {
+ return vegetarian;
+ }
+
+ public int getCalories() {
+ return calories;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public enum Type {
+ MEAT,
+ FISH,
+ OTHER
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public static final List menu =
+ Arrays.asList(new Dish("pork", false, 800, Dish.Type.MEAT),
+ new Dish("beef", false, 700, Dish.Type.MEAT),
+ new Dish("chicken", false, 400, Dish.Type.MEAT),
+ new Dish("french fries", true, 530, Dish.Type.OTHER),
+ new Dish("rice", true, 350, Dish.Type.OTHER),
+ new Dish("season fruit", true, 120, Dish.Type.OTHER),
+ new Dish("pizza", true, 550, Dish.Type.OTHER),
+ new Dish("prawns", false, 400, Dish.Type.FISH),
+ new Dish("salmon", false, 450, Dish.Type.FISH));
+}
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
new file mode 100644
index 0000000..4a3a41f
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
@@ -0,0 +1,84 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.stream.Collectors.groupingBy;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class GroupingTransactions {
+
+ public static List transactions = Arrays.asList(
+ new Transaction(Currency.EUR, 1500.0),
+ new Transaction(Currency.USD, 2300.0),
+ new Transaction(Currency.GBP, 9900.0),
+ new Transaction(Currency.EUR, 1100.0),
+ new Transaction(Currency.JPY, 7800.0),
+ new Transaction(Currency.CHF, 6700.0),
+ new Transaction(Currency.EUR, 5600.0),
+ new Transaction(Currency.USD, 4500.0),
+ new Transaction(Currency.CHF, 3400.0),
+ new Transaction(Currency.GBP, 3200.0),
+ new Transaction(Currency.USD, 4600.0),
+ new Transaction(Currency.JPY, 5700.0),
+ new Transaction(Currency.EUR, 6800.0));
+
+ public static void main(String... args) {
+ groupImperatively();
+ groupFunctionally();
+
+ }
+
+ private static void groupImperatively() {
+ Map> transactionsByCurrencies = new HashMap<>();
+ for (Transaction transaction : transactions) {
+ Currency currency = transaction.getCurrency();
+ List transactionsForCurrency = transactionsByCurrencies.get(currency);
+ if (transactionsForCurrency == null) {
+ transactionsForCurrency = new ArrayList<>();
+ transactionsByCurrencies.put(currency, transactionsForCurrency);
+ }
+ transactionsForCurrency.add(transaction);
+ }
+
+ System.out.println(transactionsByCurrencies);
+ }
+
+ private static void groupFunctionally() {
+ Map> transactionsByCurrencies = transactions.stream().collect(groupingBy(Transaction::getCurrency));
+ System.out.println(transactionsByCurrencies);
+ }
+
+ public static class Transaction {
+ private final Currency currency;
+ private final double value;
+
+ public Transaction(Currency currency, double value) {
+ this.currency = currency;
+ this.value = value;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return currency + " " + value;
+ }
+ }
+
+ public enum Currency {
+ EUR,
+ USD,
+ JPY,
+ GBP,
+ CHF
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java
new file mode 100644
index 0000000..c27f3ed
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java
@@ -0,0 +1,85 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class PuttingIntoPractice {
+ public static void main(String... args) {
+ Trader raoul = new Trader("Raoul", "Cambridge");
+ Trader mario = new Trader("Mario", "Milan");
+ Trader alan = new Trader("Alan", "Cambridge");
+ Trader brian = new Trader("Brian", "Cambridge");
+
+ List transactions = Arrays.asList(
+ new Transaction(brian, 2011, 300),
+ new Transaction(raoul, 2012, 1000),
+ new Transaction(raoul, 2011, 400),
+ new Transaction(mario, 2012, 710),
+ new Transaction(mario, 2012, 700),
+ new Transaction(alan, 2012, 950)
+ );
+
+ // Query 1: Find all transactions from year 2011 and sort them by value (small to high).
+ List tr2011 = transactions.stream()
+ .filter(transaction -> transaction.getYear() == 2011)
+ .sorted(comparing(Transaction::getValue))
+ .collect(toList());
+ System.out.println(tr2011);
+
+ // Query 2: What are all the unique cities where the traders work?
+ List cities =
+ transactions.stream()
+ .map(transaction -> transaction.getTrader().getCity())
+ .distinct()
+ .collect(toList());
+ System.out.println(cities);
+
+ // Query 3: Find all traders from Cambridge and sort them by name.
+
+ List traders =
+ transactions.stream()
+ .map(Transaction::getTrader)
+ .filter(trader -> trader.getCity().equals("Cambridge"))
+ .distinct()
+ .sorted(comparing(Trader::getName))
+ .collect(toList());
+ System.out.println(traders);
+
+ // Query 4: Return a string of all traders’ names sorted alphabetically.
+
+ String traderStr =
+ transactions.stream()
+ .map(transaction -> transaction.getTrader().getName())
+ .distinct()
+ .sorted()
+ .reduce("", (n1, n2) -> n1 + n2);
+ System.out.println(traderStr);
+
+ // Query 5: Are there any trader based in Milan?
+
+ boolean milanBased =
+ transactions.stream()
+ .anyMatch(transaction -> transaction.getTrader()
+ .getCity()
+ .equals("Milan")
+ );
+ System.out.println(milanBased);
+
+ // Query 6: Update all transactions so that the traders from Milan are set to Cambridge.
+ transactions.stream()
+ .map(Transaction::getTrader)
+ .filter(trader -> trader.getCity().equals("Milan"))
+ .forEach(trader -> trader.setCity("Cambridge"));
+ System.out.println(transactions);
+
+ // Query 7: What's the highest value in all the transactions?
+ int highestValue =
+ transactions.stream()
+ .map(Transaction::getValue)
+ .reduce(0, Integer::max);
+ System.out.println(highestValue);
+ }
+}
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java
new file mode 100644
index 0000000..7f516a5
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java
@@ -0,0 +1,50 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class StreamBasic {
+
+ public static void main(String... args) {
+ // Java 7
+ getLowCaloricDishesNamesInJava7(Dish.menu).forEach(System.out::println);
+
+ System.out.println("---");
+
+ // Java 8
+ getLowCaloricDishesNamesInJava8(Dish.menu).forEach(System.out::println);
+
+ }
+
+ public static List getLowCaloricDishesNamesInJava7(List dishes) {
+ List lowCaloricDishes = new ArrayList<>();
+ for (Dish d : dishes) {
+ if (d.getCalories() < 400) {
+ lowCaloricDishes.add(d);
+ }
+ }
+ List lowCaloricDishesName = new ArrayList<>();
+ Collections.sort(lowCaloricDishes, new Comparator() {
+ public int compare(Dish d1, Dish d2) {
+ return Integer.compare(d1.getCalories(), d2.getCalories());
+ }
+ });
+ for (Dish d : lowCaloricDishes) {
+ lowCaloricDishesName.add(d.getName());
+ }
+ return lowCaloricDishesName;
+ }
+
+ public static List getLowCaloricDishesNamesInJava8(List dishes) {
+ return dishes.stream()
+ .filter(d -> d.getCalories() < 400)
+ .sorted(comparing(Dish::getCalories))
+ .map(Dish::getName)
+ .collect(toList());
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java
new file mode 100644
index 0000000..b008b12
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java8.streamapi;
+
+public class Trader {
+
+ private String name;
+ private String city;
+
+ public Trader(String n, String c) {
+ this.name = n;
+ this.city = c;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getCity() {
+ return this.city;
+ }
+
+ public void setCity(String newCity) {
+ this.city = newCity;
+ }
+
+ public String toString() {
+ return "Trader:" + this.name + " in " + this.city;
+ }
+}
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java
new file mode 100644
index 0000000..656149c
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java8.streamapi;
+
+public class Transaction {
+
+ private Trader trader;
+ private int year;
+ private int value;
+
+ public Transaction(Trader trader, int year, int value) {
+ this.trader = trader;
+ this.year = year;
+ this.value = value;
+ }
+
+ public Trader getTrader() {
+ return this.trader;
+ }
+
+ public int getYear() {
+ return this.year;
+ }
+
+ public int getValue() {
+ return this.value;
+ }
+
+ public String toString() {
+ return "{" + this.trader + ", " +
+ "year: " + this.year + ", " +
+ "value:" + this.value + "}";
+ }
+}
\ No newline at end of file
diff --git a/java8/src/main/resources/data-building.txt b/java8/src/main/resources/data-building.txt
new file mode 100644
index 0000000..2230972
--- /dev/null
+++ b/java8/src/main/resources/data-building.txt
@@ -0,0 +1,2 @@
+The quick brown fox jumped over the lazy dog
+The lazy dog jumped over the quick brown fox
From 874c3c4800d8943c81d340e7a930931334364fbd Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sat, 7 Jan 2017 23:03:43 +0800
Subject: [PATCH 23/62] [add] add some stream api examples
---
.../java8/lambda/FilteringApples.java | 2 +
.../java8/streamapi/BuildingStreams.java | 10 +-
.../java8/streamapi/GroupingTransactions.java | 3 +
.../learning/java8/streamapi/Laziness.java | 30 +++++
.../learning/java8/streamapi/Mapping.java | 48 +++++++
.../streamapi/PartitionPrimeNumbers.java | 121 ++++++++++++++++++
.../learning/java8/streamapi/Reducing.java | 30 +++++
.../learning/java8/streamapi/StreamBasic.java | 3 +
8 files changed, 242 insertions(+), 5 deletions(-)
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Reducing.java
diff --git a/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
index a06bdf1..e04b739 100644
--- a/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
+++ b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
@@ -7,6 +7,8 @@
/**
* Created by brian on 16/12/26.
+ *
+ *
*/
public class FilteringApples {
public static void main(String[] args) {
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
index 1dc21ba..13d0cd3 100644
--- a/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
@@ -8,6 +8,9 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
+/**
+ * 斐波拉切数列的几种生成方法
+ */
public class BuildingStreams {
public static void main(String... args) throws Exception {
@@ -48,11 +51,8 @@ public static void main(String... args) throws Exception {
.limit(5)
.forEach(System.out::println);
- IntStream.generate(new IntSupplier() {
- public int getAsInt() {
- return 2;
- }
- }).limit(5)
+ IntStream.generate(() -> 2)
+ .limit(5)
.forEach(System.out::println);
IntSupplier fib = new IntSupplier() {
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
index 4a3a41f..35a122e 100644
--- a/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
@@ -8,6 +8,9 @@
import java.util.List;
import java.util.Map;
+/**
+ * 分别使用指令式和函数式进行分组
+ */
public class GroupingTransactions {
public static List transactions = Arrays.asList(
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java
new file mode 100644
index 0000000..33d2a0e
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 流操作-中间操作
+ */
+public class Laziness {
+
+ public static void main(String[] args) {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
+ List twoEvenSquares =
+ numbers.stream()
+ .filter(n -> {
+ System.out.println("filtering " + n); return n % 2 == 0;
+ })
+ .map(n -> {
+ System.out.println("mapping " + n);
+ return n * n;
+ })
+ .limit(2)
+ .collect(toList());
+
+ twoEvenSquares.stream().forEach(System.out::println);
+ }
+
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java
new file mode 100644
index 0000000..74f63c2
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java
@@ -0,0 +1,48 @@
+package com.brianway.learning.java8.streamapi;
+
+import static com.brianway.learning.java8.streamapi.Dish.menu;
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 使用流-映射
+ * 注意扁平映射
+ */
+public class Mapping {
+
+ public static void main(String... args) {
+
+ // map
+ List dishNames = menu.stream()
+ .map(Dish::getName)
+ .collect(toList());
+ System.out.println(dishNames);
+
+ // map
+ List words = Arrays.asList("Hello", "World");
+ List wordLengths = words.stream()
+ .map(String::length)
+ .collect(toList());
+ System.out.println(wordLengths);
+
+ // flatMap
+ words.stream()
+ .flatMap((String line) -> Arrays.stream(line.split("")))
+ .distinct()
+ .forEach(System.out::println);
+
+ // flatMap
+ List numbers1 = Arrays.asList(1, 2, 3, 4, 5);
+ List numbers2 = Arrays.asList(6, 7, 8);
+ List pairs =
+ numbers1.stream()
+ .flatMap((Integer i) -> numbers2.stream()
+ .map((Integer j) -> new int[] {i, j})
+ )
+ .filter(pair -> (pair[0] + pair[1]) % 3 == 0)
+ .collect(toList());
+ pairs.forEach(pair -> System.out.println("(" + pair[0] + ", " + pair[1] + ")"));
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java
new file mode 100644
index 0000000..3d0e73e
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java
@@ -0,0 +1,121 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.stream.Collector.Characteristics.IDENTITY_FINISH;
+import static java.util.stream.Collectors.partitioningBy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+/**
+ * 分区:分类的特殊情况。分区函数返回一个布尔值
+ */
+public class PartitionPrimeNumbers {
+
+ public static void main(String... args) {
+ System.out.println("Numbers partitioned in prime and non-prime: " + partitionPrimes(100));
+ System.out.println("Numbers partitioned in prime and non-prime: " + partitionPrimesWithCustomCollector(100));
+
+ }
+
+ public static Map> partitionPrimes(int n) {
+ return IntStream.rangeClosed(2, n).boxed()
+ .collect(partitioningBy(PartitionPrimeNumbers::isPrime));
+ }
+
+ public static boolean isPrime(int candidate) {
+ return IntStream.rangeClosed(2, candidate - 1)
+ .limit((long) Math.floor(Math.sqrt((double) candidate)) - 1)
+ .noneMatch(i -> candidate % i == 0);
+ }
+
+ public static Map> partitionPrimesWithCustomCollector(int n) {
+ return IntStream.rangeClosed(2, n).boxed().collect(new PrimeNumbersCollector());
+ }
+
+ public static boolean isPrime(List primes, Integer candidate) {
+ double candidateRoot = Math.sqrt((double) candidate);
+ //return primes.stream().filter(p -> p < candidateRoot).noneMatch(p -> candidate % p == 0);
+ return takeWhile(primes, i -> i <= candidateRoot).stream().noneMatch(i -> candidate % i == 0);
+ }
+
+ public static List takeWhile(List list, Predicate p) {
+ int i = 0;
+ for (A item : list) {
+ if (!p.test(item)) {
+ return list.subList(0, i);
+ }
+ i++;
+ }
+ return list;
+ }
+
+ public static class PrimeNumbersCollector
+ implements Collector>, Map>> {
+
+ @Override
+ public Supplier