From adaafc70b9734b53ae3dfc449a5a22adaddf7491 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 30 Mar 2016 15:23:59 +0800
Subject: [PATCH 01/80] update README
---
README.md | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 4266610..e69884a 100644
--- a/README.md
+++ b/README.md
@@ -14,8 +14,8 @@
如果你只是单纯要阅读的话,建议移步CSDN或者oschina上观看,访问速度快很多:
->* [我的java&javaweb学习笔记(汇总)](http://blog.csdn.net/h3243212/article/details/50659471)
->* [我的java&javaweb学习笔记(汇总)](http://my.oschina.net/brianway/blog/614355)
+>* CSDN:[我的java&javaweb学习笔记(汇总)](http://blog.csdn.net/h3243212/article/details/50659471)
+>* oschina:[我的java&javaweb学习笔记(汇总)](http://my.oschina.net/brianway/blog/614355)
-----
@@ -40,6 +40,14 @@
- [javaweb入门笔记(5)-cookie和session.md](/javaweb/javaweb入门笔记(5)-cookie和session.md)
- [javaweb入门笔记(6)-JSP技术.md](/javaweb/javaweb入门笔记(6)-JSP技术.md)
+-----
+
+# TODO
+
+源码写的有些零散,暂时未放出,我会整理成maven的结构,然后以测试驱动的形式重构一遍。
+
+清明出去玩一趟,估计4月或者5月会放出源码。
+
-----
@@ -52,4 +60,4 @@
-----
-**All copyright reserved**
\ No newline at end of file
+**All Copyright Reserved**
\ No newline at end of file
From 151e365e6696f7ca8745001155d36e46d87aee0c Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Tue, 12 Apr 2016 15:43:33 +0800
Subject: [PATCH 02/80] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=95=B4=E4=B8=AA?=
=?UTF-8?q?=E4=BB=93=E5=BA=93=E7=9A=84=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 21 +++
README.md | 74 +++++++----
...50\256\260(1)-\345\217\215\345\260\204.md" | 0
...50\256\260(2)-\346\263\233\345\236\213.md" | 0
...73\345\212\240\350\275\275\345\231\250.md" | 0
...50\256\260(4)-\344\273\243\347\220\206.md" | 0
...04\345\260\217\346\241\206\346\236\266.md" | 0
...37\345\244\232\347\272\277\347\250\213.md" | 0
...61\344\272\253\346\225\260\346\215\256.md" | 0
...13\345\271\266\345\217\221\345\272\223.md" | 0
...50\256\260(6)-\346\263\250\350\247\243.md" | 0
...\250\347\254\224\350\256\260(1)-Tomcat.md" | 0
...56\260(2)-http\345\205\245\351\227\250.md" | 0
...250\347\254\224\350\256\260(3)-Servlet.md" | 0
...256\260(4)-request\345\222\214response.md" | 0
...0\256\260(5)-cookie\345\222\214session.md" | 0
...256\260(6)-JSP\346\212\200\346\234\257.md" | 0
java-base/pom.xml | 15 +++
java-multithread/pom.xml | 22 ++++
.../learning/java/multithread/meet/Run.java | 49 +++++++
.../multithread/meet/Run10_isInterrupted.java | 41 ++++++
.../meet/Run11_sleepAndinterrupt01.java | 60 +++++++++
.../meet/Run12_sleepAndinterrupt02.java | 58 ++++++++
.../meet/Run13_suspendAndresume01.java | 66 ++++++++++
.../meet/Run14_suspendAndresume02.java | 59 +++++++++
.../meet/Run15_suspendAndresume03.java | 67 ++++++++++
.../java/multithread/meet/Run16_yield.java | 45 +++++++
.../multithread/meet/Run17_priority01.java | 56 ++++++++
.../multithread/meet/Run18_priority02.java | 124 ++++++++++++++++++
.../multithread/meet/Run2_StartVsRun.java | 47 +++++++
.../java/multithread/meet/Run3_getName.java | 48 +++++++
.../java/multithread/meet/Run4_isAlive01.java | 45 +++++++
.../java/multithread/meet/Run5_isAlive02.java | 60 +++++++++
.../multithread/meet/Run6_StartVsRun02.java | 57 ++++++++
.../multithread/meet/Run7_interrupt01.java | 37 ++++++
.../multithread/meet/Run8_interrupted01.java | 69 ++++++++++
.../multithread/meet/Run9_interrupted02.java | 26 ++++
.../java/multithread/meet/printMain.java | 19 +++
.../synchronize/example1/HasLocalNum.java | 26 ++++
.../synchronize/example1/Run1_local.java | 31 +++++
.../synchronize/example1/ThreadA.java | 18 +++
.../synchronize/example1/ThreadB.java | 18 +++
.../example2/HasSelfPrivateNum.java | 25 ++++
.../synchronize/example2/Run2_private01.java | 40 ++++++
.../synchronize/example2/Run2_twoObject.java | 32 +++++
.../synchronize/example2/ThreadA.java | 18 +++
.../synchronize/example2/ThreadB.java | 18 +++
pom.xml | 63 +++++++++
48 files changed, 1427 insertions(+), 27 deletions(-)
create mode 100644 .gitignore
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(1)-\345\217\215\345\260\204.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(1)-\345\217\215\345\260\204.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(2)-\346\263\233\345\236\213.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(2)-\346\263\233\345\236\213.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(3)-\347\261\273\345\212\240\350\275\275\345\231\250.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(3)-\347\261\273\345\212\240\350\275\275\345\231\250.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\344\273\243\347\220\206.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\344\273\243\347\220\206.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\345\256\236\347\216\260AOP\345\212\237\350\203\275\347\232\204\345\260\201\350\243\205\344\270\216\351\205\215\347\275\256\347\232\204\345\260\217\346\241\206\346\236\266.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\345\256\236\347\216\260AOP\345\212\237\350\203\275\347\232\204\345\260\201\350\243\205\344\270\216\351\205\215\347\275\256\347\232\204\345\260\217\346\241\206\346\236\266.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\344\274\240\347\273\237\345\244\232\347\272\277\347\250\213.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\344\274\240\347\273\237\345\244\232\347\272\277\347\250\213.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\345\205\261\344\272\253\346\225\260\346\215\256.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\345\205\261\344\272\253\346\225\260\346\215\256.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\347\272\277\347\250\213\345\271\266\345\217\221\345\272\223.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\347\272\277\347\250\213\345\271\266\345\217\221\345\272\223.md" (100%)
rename "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(6)-\346\263\250\350\247\243.md" => "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(6)-\346\263\250\350\247\243.md" (100%)
rename "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(1)-Tomcat.md" => "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(1)-Tomcat.md" (100%)
rename "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(2)-http\345\205\245\351\227\250.md" => "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(2)-http\345\205\245\351\227\250.md" (100%)
rename "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(3)-Servlet.md" => "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(3)-Servlet.md" (100%)
rename "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(4)-request\345\222\214response.md" => "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(4)-request\345\222\214response.md" (100%)
rename "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(5)-cookie\345\222\214session.md" => "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(5)-cookie\345\222\214session.md" (100%)
rename "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(6)-JSP\346\212\200\346\234\257.md" => "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(6)-JSP\346\212\200\346\234\257.md" (100%)
create mode 100644 java-base/pom.xml
create mode 100644 java-multithread/pom.xml
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run17_priority01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run18_priority02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run8_interrupted01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/printMain.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/HasLocalNum.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/Run1_local.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java
create mode 100644 pom.xml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8f76020
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+# Eclipse
+.classpath
+.project
+.settings/
+
+# Intellij
+.idea/
+*.iml
+*.iws
+
+# Mac
+.DS_Store
+
+# Maven
+log/
+target/
+out/
+
+# Others
+bin/
+.myeclipse
\ No newline at end of file
diff --git a/README.md b/README.md
index e69884a..caeb742 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,5 @@
# 我的java学习笔记
-笔记分为两大部分:javase和javaweb
-
-- [javase](/javase)
-- [javaweb](/javaweb)
-
笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解java基础语法,想进一步深入学习的人
@@ -20,33 +15,56 @@
-----
-# 目录
-
- - [javase](/javase)
- - [java基础巩固笔记(1)-反射.md](/javase/java基础巩固笔记(1)-反射.md)
- - [java基础巩固笔记(2)-泛型.md](/javase/java基础巩固笔记(2)-泛型.md)
- - [java基础巩固笔记(3)-类加载器.md](/javase/java基础巩固笔记(3)-类加载器.md)
- - [java基础巩固笔记(4)-代理.md](/javase/java基础巩固笔记(4)-代理.md)
- - [java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md](/javase/java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md)
- - [java基础巩固笔记(5)-多线程之传统多线程.md](/javase/java基础巩固笔记(5)-多线程之传统多线程.md)
- - [java基础巩固笔记(5)-多线程之共享数据.md](/javase/java基础巩固笔记(5)-多线程之共享数据.md)
- - [java基础巩固笔记(5)-多线程之线程并发库.md](/javase/java基础巩固笔记(5)-多线程之线程并发库.md)
- - [java基础巩固笔记(6)-注解.md](/javase/java基础巩固笔记(6)-注解.md)
- - [javaweb](/javaweb)
- - [javaweb入门笔记(1)-Tomcat.md](/javaweb/javaweb入门笔记(1)-Tomcat.md)
- - [javaweb入门笔记(2)-http入门.md](/javaweb/javaweb入门笔记(2)-http入门.md)
- - [javaweb入门笔记(3)-Servlet.md](/javaweb/javaweb入门笔记(3)-Servlet.md)
- - [javaweb入门笔记(4)-request和response.md](/javaweb/javaweb入门笔记(4)-request和response.md)
- - [javaweb入门笔记(5)-cookie和session.md](/javaweb/javaweb入门笔记(5)-cookie和session.md)
- - [javaweb入门笔记(6)-JSP技术.md](/javaweb/javaweb入门笔记(6)-JSP技术.md)
+# 仓库目录
+
+- [blogs](/blogs):博客文档
+- [java-base](/java-base):java基础巩固部分的模块
+- [java-multithread](/java-multithread):多线程部分的模块
+
+
+# 博客文档
+
+笔记分为两大部分:javase和javaweb
+
+- [javase](/blogs/javase)
+- [javaweb](/blogs/javaweb)
+
+
+**博客目录**
+
+- [javase](/blogs/javase)
+ - [java基础巩固笔记(1)-反射.md](/blogs/javase/java基础巩固笔记(1)-反射.md)
+ - [java基础巩固笔记(2)-泛型.md](/blogs/javase/java基础巩固笔记(2)-泛型.md)
+ - [java基础巩固笔记(3)-类加载器.md](/blogs/javase/java基础巩固笔记(3)-类加载器.md)
+ - [java基础巩固笔记(4)-代理.md](/blogs/javase/java基础巩固笔记(4)-代理.md)
+ - [java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md](/blogs/javase/java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md)
+ - [java基础巩固笔记(5)-多线程之传统多线程.md](/blogs/javase/java基础巩固笔记(5)-多线程之传统多线程.md)
+ - [java基础巩固笔记(5)-多线程之共享数据.md](/blogs/javase/java基础巩固笔记(5)-多线程之共享数据.md)
+ - [java基础巩固笔记(5)-多线程之线程并发库.md](/blogs/javase/java基础巩固笔记(5)-多线程之线程并发库.md)
+ - [java基础巩固笔记(6)-注解.md](/blogs/javase/java基础巩固笔记(6)-注解.md)
+- [javaweb](/blogs/javaweb)
+ - [javaweb入门笔记(1)-Tomcat.md](/blogs/javaweb/javaweb入门笔记(1)-Tomcat.md)
+ - [javaweb入门笔记(2)-http入门.md](/blogs/javaweb/javaweb入门笔记(2)-http入门.md)
+ - [javaweb入门笔记(3)-Servlet.md](/blogs/javaweb/javaweb入门笔记(3)-Servlet.md)
+ - [javaweb入门笔记(4)-request和response.md](/blogs/javaweb/javaweb入门笔记(4)-request和response.md)
+ - [javaweb入门笔记(5)-cookie和session.md](/blogs/javaweb/javaweb入门笔记(5)-cookie和session.md)
+ - [javaweb入门笔记(6)-JSP技术.md](/blogs/javaweb/javaweb入门笔记(6)-JSP技术.md)
+
+
-----
+
# TODO
-源码写的有些零散,暂时未放出,我会整理成maven的结构,然后以测试驱动的形式重构一遍。
+计划将这个仓库进行重构,逐步扩充并实现下面的功能。
+
+* [x] 整理成maven的结构,使用聚合和继承特性(2016.4.12完成)
+* [ ] 原有的javase部分代码重构为java-base模块,并逐步上传代码
+* [ ] 多线程部分使用java-multithread模块(进行中)
+* [ ] 集合类部分使用模块java-collection
+* [ ] IO部分使用模块java-io
-清明出去玩一趟,估计4月或者5月会放出源码。
-----
@@ -60,4 +78,6 @@
-----
-**All Copyright Reserved**
\ No newline at end of file
+# Lisence
+
+Lisenced under [Apache 2.0 lisence](http://opensource.org/licenses/Apache-2.0)
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(1)-\345\217\215\345\260\204.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(1)-\345\217\215\345\260\204.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(1)-\345\217\215\345\260\204.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(1)-\345\217\215\345\260\204.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(2)-\346\263\233\345\236\213.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(2)-\346\263\233\345\236\213.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(2)-\346\263\233\345\236\213.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(2)-\346\263\233\345\236\213.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(3)-\347\261\273\345\212\240\350\275\275\345\231\250.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(3)-\347\261\273\345\212\240\350\275\275\345\231\250.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(3)-\347\261\273\345\212\240\350\275\275\345\231\250.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(3)-\347\261\273\345\212\240\350\275\275\345\231\250.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\344\273\243\347\220\206.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\344\273\243\347\220\206.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\344\273\243\347\220\206.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\344\273\243\347\220\206.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\345\256\236\347\216\260AOP\345\212\237\350\203\275\347\232\204\345\260\201\350\243\205\344\270\216\351\205\215\347\275\256\347\232\204\345\260\217\346\241\206\346\236\266.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\345\256\236\347\216\260AOP\345\212\237\350\203\275\347\232\204\345\260\201\350\243\205\344\270\216\351\205\215\347\275\256\347\232\204\345\260\217\346\241\206\346\236\266.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\345\256\236\347\216\260AOP\345\212\237\350\203\275\347\232\204\345\260\201\350\243\205\344\270\216\351\205\215\347\275\256\347\232\204\345\260\217\346\241\206\346\236\266.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(4)-\345\256\236\347\216\260AOP\345\212\237\350\203\275\347\232\204\345\260\201\350\243\205\344\270\216\351\205\215\347\275\256\347\232\204\345\260\217\346\241\206\346\236\266.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\344\274\240\347\273\237\345\244\232\347\272\277\347\250\213.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\344\274\240\347\273\237\345\244\232\347\272\277\347\250\213.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\344\274\240\347\273\237\345\244\232\347\272\277\347\250\213.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\344\274\240\347\273\237\345\244\232\347\272\277\347\250\213.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\345\205\261\344\272\253\346\225\260\346\215\256.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\345\205\261\344\272\253\346\225\260\346\215\256.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\345\205\261\344\272\253\346\225\260\346\215\256.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\345\205\261\344\272\253\346\225\260\346\215\256.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\347\272\277\347\250\213\345\271\266\345\217\221\345\272\223.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\347\272\277\347\250\213\345\271\266\345\217\221\345\272\223.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\347\272\277\347\250\213\345\271\266\345\217\221\345\272\223.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(5)-\345\244\232\347\272\277\347\250\213\344\271\213\347\272\277\347\250\213\345\271\266\345\217\221\345\272\223.md"
diff --git "a/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(6)-\346\263\250\350\247\243.md" "b/blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(6)-\346\263\250\350\247\243.md"
similarity index 100%
rename from "javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(6)-\346\263\250\350\247\243.md"
rename to "blogs/javase/java\345\237\272\347\241\200\345\267\251\345\233\272\347\254\224\350\256\260(6)-\346\263\250\350\247\243.md"
diff --git "a/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(1)-Tomcat.md" "b/blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(1)-Tomcat.md"
similarity index 100%
rename from "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(1)-Tomcat.md"
rename to "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(1)-Tomcat.md"
diff --git "a/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(2)-http\345\205\245\351\227\250.md" "b/blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(2)-http\345\205\245\351\227\250.md"
similarity index 100%
rename from "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(2)-http\345\205\245\351\227\250.md"
rename to "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(2)-http\345\205\245\351\227\250.md"
diff --git "a/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(3)-Servlet.md" "b/blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(3)-Servlet.md"
similarity index 100%
rename from "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(3)-Servlet.md"
rename to "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(3)-Servlet.md"
diff --git "a/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(4)-request\345\222\214response.md" "b/blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(4)-request\345\222\214response.md"
similarity index 100%
rename from "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(4)-request\345\222\214response.md"
rename to "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(4)-request\345\222\214response.md"
diff --git "a/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(5)-cookie\345\222\214session.md" "b/blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(5)-cookie\345\222\214session.md"
similarity index 100%
rename from "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(5)-cookie\345\222\214session.md"
rename to "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(5)-cookie\345\222\214session.md"
diff --git "a/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(6)-JSP\346\212\200\346\234\257.md" "b/blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(6)-JSP\346\212\200\346\234\257.md"
similarity index 100%
rename from "javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(6)-JSP\346\212\200\346\234\257.md"
rename to "blogs/javaweb/javaweb\345\205\245\351\227\250\347\254\224\350\256\260(6)-JSP\346\212\200\346\234\257.md"
diff --git a/java-base/pom.xml b/java-base/pom.xml
new file mode 100644
index 0000000..d8bb048
--- /dev/null
+++ b/java-base/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ java-learning
+ com.brianway.learning.java
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ java-base
+
+
+
\ No newline at end of file
diff --git a/java-multithread/pom.xml b/java-multithread/pom.xml
new file mode 100644
index 0000000..ec99a5e
--- /dev/null
+++ b/java-multithread/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ java-learning
+ com.brianway.learning.java
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ java-multihread
+
+
+
+ junit
+ junit
+
+
+
+
+
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run.java
new file mode 100644
index 0000000..abb075b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run.java
@@ -0,0 +1,49 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/10.
+ */
+
+/**
+ * P11数据共享的例子
+ */
+
+class MyThread extends Thread{
+ private int count = 5;
+
+ @Override
+ public void run() {
+ super.run();
+ count--;
+ System.out.println("由"+this.currentThread().getName()+" 计算,count="+count);
+ }
+}
+
+public class Run {
+ public static void main(String[] args) {
+ MyThread myThread = new MyThread();
+ Thread a = new Thread(myThread,"A");
+ Thread b = new Thread(myThread,"B");
+ Thread c = new Thread(myThread,"C");
+ Thread d = new Thread(myThread,"D");
+ a.start();
+ b.start();
+ c.start();
+ d.start();
+ }
+}
+
+
+/*
+output(某一次):
+由A 计算,count=3
+由C 计算,count=2
+由B 计算,count=3
+由D 计算,count=1
+
+output(某一次):
+由A 计算,count=4
+由C 计算,count=3
+由D 计算,count=1
+由B 计算,count=1
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java
new file mode 100644
index 0000000..eedf093
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run10_isInterrupted.java
@@ -0,0 +1,41 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P26例子
+ * isInterrupted(),不清除状态标记
+ */
+
+public class Run10_isInterrupted {
+ public static void main(String[] args) {
+ try {
+ MyThread7 myThread7 = new MyThread7();
+ myThread7.start();
+ Thread.sleep(100);
+ myThread7.interrupt();
+ System.out.println("Thread.interrupted(),是否停止1?="+myThread7.isInterrupted());
+ System.out.println("Thread.interrupted(),是否停止2?="+myThread7.isInterrupted());
+ } catch (InterruptedException e) {
+ System.out.println("main catch");
+ e.printStackTrace();
+ }
+ System.out.println("end");
+ }
+}
+
+/*
+输出节选:
+i=17596
+i=17597
+i=17598
+i=17599
+Thread.interrupted(),是否停止1?=true
+Thread.interrupted(),是否停止2?=true
+end
+i=17600
+i=17601
+i=17602
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java
new file mode 100644
index 0000000..13b33d0
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run11_sleepAndinterrupt01.java
@@ -0,0 +1,60 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P30
+ * 睡眠中停止,先进入的sleep,再interrupt()
+ */
+class MyThread11 extends Thread{
+ @Override
+ public void run() {
+ super.run();
+
+ try {
+ System.out.println("run begin");
+ Thread.sleep(20000);
+ System.out.println("run end");
+ } catch (InterruptedException e) {
+ System.out.println("沉睡中被停止!进入catch!"+this.isInterrupted());
+ e.printStackTrace();
+ }
+ }
+}
+
+public class Run11_sleepAndinterrupt01 {
+ public static void main(String[] args) {
+ try {
+ MyThread11 myThread11 =new MyThread11();
+ myThread11.start();
+ Thread.sleep(200);
+ myThread11.interrupt();
+ } catch (InterruptedException e) {
+ System.out.println("main catch");
+ e.printStackTrace();
+ }
+ System.out.println("end");
+ }
+}
+
+/*
+输出:
+run begin
+沉睡中被停止!进入catch!false
+end
+java.lang.InterruptedException: sleep interrupted
+ at java.lang.Thread.sleep(Native Method)
+ at com.brianway.learning.java.multithread.meet.MyThread11.run(Run11_sleepAndinterrupt01.java:18)
+
+-------
+输出不唯一:
+run begin
+end
+沉睡中被停止!进入catch!false
+java.lang.InterruptedException: sleep interrupted
+ at java.lang.Thread.sleep(Native Method)
+ at com.brianway.learning.java.multithread.meet.MyThread11.run(Run11_sleepAndinterrupt01.java:18)
+
+*/
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java
new file mode 100644
index 0000000..7282060
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run12_sleepAndinterrupt02.java
@@ -0,0 +1,58 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P31例子
+ * 先interrupt(),再进入sleep(),直接进异常
+ */
+class MyThread12 extends Thread{
+ @Override
+ public void run() {
+ super.run();
+ try {
+ for(int i=0;i<100000;i++){
+ System.out.println("i="+(i+1));
+ }
+ System.out.println("run begin");
+ Thread.sleep(200000);
+ System.out.println("run end");
+ } catch (InterruptedException e) {
+ System.out.println("先停止,再遇到了sleep!进入catch");
+ e.printStackTrace();
+ }
+ }
+}
+
+public class Run12_sleepAndinterrupt02 {
+ public static void main(String[] args) {
+ MyThread12 myThread12 =new MyThread12();
+ myThread12.start();
+ myThread12.interrupt();
+ System.out.println("end!");
+ }
+}
+
+/*
+输出:
+end!
+i=1
+i=2
+i=3
+i=4
+省略。。。
+
+i=99998
+i=99999
+i=100000
+run begin
+先停止,再遇到了sleep!进入catch
+java.lang.InterruptedException: sleep interrupted
+ at java.lang.Thread.sleep(Native Method)
+ at com.brianway.learning.java.multithread.meet.MyThread12.run(Run12_sleepAndinterrupt02.java:19)
+
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java
new file mode 100644
index 0000000..a3a6932
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run13_suspendAndresume01.java
@@ -0,0 +1,66 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P36例子
+ * 暂停线程
+ * suspend与resume
+ */
+class MyThread13 extends Thread{
+ private long i = 0;
+ public long getI() {
+ return i;
+ }
+
+ public void setI(long i) {
+ this.i = i;
+ }
+
+ @Override
+ public void run() {
+ while(true){
+ i++;
+ }
+ }
+}
+
+public class Run13_suspendAndresume01 {
+ public static void main(String[] args) {
+ try {
+ MyThread13 myThread13 = new MyThread13();
+ myThread13.start();
+ Thread.sleep(5000);
+ //A段
+ myThread13.suspend();
+ System.out.println("A= "+System.currentTimeMillis()+" i="+myThread13.getI());
+ Thread.sleep(5000);
+ System.out.println("A= "+System.currentTimeMillis()+" i="+myThread13.getI());
+
+ //B段
+ myThread13.resume();
+ Thread.sleep(5000);
+ //C段
+ myThread13.suspend();
+ System.out.println("B= "+System.currentTimeMillis()+" i="+myThread13.getI());
+ Thread.sleep(5000);
+ System.out.println("B= "+System.currentTimeMillis()+" i="+myThread13.getI());
+
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println("end");
+ }
+}
+
+/*
+输出:
+A= 1460358676950 i=2813771327
+A= 1460358681950 i=2813771327
+B= 1460358686951 i=5617784671
+B= 1460358691951 i=5617784671
+end
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java
new file mode 100644
index 0000000..c76ea5f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run14_suspendAndresume02.java
@@ -0,0 +1,59 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P38例子
+ * suspend与resume的缺点:独占
+ */
+
+class SynchronizedObject{
+ synchronized public void printString(){
+ System.out.println("begin printString");
+ if(Thread.currentThread().getName().equals("a")){
+ System.out.println("a线程永远suspend了!");
+ Thread.currentThread().suspend();
+ }
+ System.out.println("end printString");
+ }
+}
+
+public class Run14_suspendAndresume02 {
+ public static void main(String[] args) {
+ try {
+ final SynchronizedObject object = new SynchronizedObject();
+ Thread thread1 =new Thread(){
+ @Override
+ public void run() {
+ object.printString();
+ }
+ };
+ thread1.setName("a");
+ thread1.start();
+ Thread.sleep(1000);
+
+ Thread thread2 =new Thread(){
+ @Override
+ public void run() {
+ System.out.println("thread2启动了,但进不了printString()方法!只打印一个begin");
+ System.out.println("因为printString()方法被a线程锁定并且永远suspend暂停了!");
+ object.printString();
+ }
+ };
+ thread2.start();
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+/*
+输出:
+begin printString
+a线程永远suspend了!
+thread2启动了,但进不了printString()方法!只打印一个begin
+因为printString()方法被a线程锁定并且永远suspend暂停了!
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java
new file mode 100644
index 0000000..12213bc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run15_suspendAndresume03.java
@@ -0,0 +1,67 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P39
+ * suspend独占锁问题,println()
+ */
+
+class MyThread15 extends Thread{
+ private long i = 0;
+
+ @Override
+ public void run() {
+ while(true){
+ i++;
+ System.out.println(i);
+ }
+ }
+}
+
+
+public class Run15_suspendAndresume03 {
+ public static void main(String[] args) {
+ try {
+ MyThread15 myThread15 = new MyThread15();
+ myThread15.start();
+ Thread.sleep(1000);
+ System.out.println("main before myThread15.suspend()!");
+ myThread15.suspend();
+ System.out.println("main end!");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+/*
+输出:
+09162
+309163
+main before myThread15.suspend()!
+309164
+309165
+309166
+309167
+309168
+309169
+309170
+309171
+309172
+309173
+309174
+309175
+309176
+309177
+309178
+309179
+309180
+309181
+309182
+309183
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java
new file mode 100644
index 0000000..fedb504
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P42例子
+ * 测试yield
+ */
+
+class MyThread16 extends Thread{
+ @Override
+ public void run() {
+ long beginTime = System.currentTimeMillis();
+ int count = 0;
+ for(int i=0;i<50000000;i++){
+ Thread.yield();
+ count = count + (i+1);
+ }
+ long endTime = System.currentTimeMillis();
+ System.out.println("用时:" + (endTime - beginTime) + "毫秒");
+ }
+}
+
+public class Run16_yield {
+ public static void main(String[] args) {
+ MyThread16 myThread16 = new MyThread16();
+ myThread16.start();
+ }
+}
+
+
+/*
+//Thread.yield();
+输出:
+用时:2毫秒
+
+-----------------
+
+Thread.yield();
+输出:
+用时:3302毫秒
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run17_priority01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run17_priority01.java
new file mode 100644
index 0000000..8007589
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run17_priority01.java
@@ -0,0 +1,56 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P43例子
+ * 线程优先级的继承性
+ */
+
+class MyThread17_1 extends Thread{
+ @Override
+ public void run() {
+ System.out.println("MyThread17_1 run priority="+ this.getPriority());
+ MyThread17_2 myThread17_2 = new MyThread17_2();
+ myThread17_2.start();
+
+ }
+}
+
+class MyThread17_2 extends Thread{
+ @Override
+ public void run() {
+ System.out.println("MyThread17_2 run priority="+ this.getPriority());
+ }
+}
+
+public class Run17_priority01 {
+ public static void main(String[] args) {
+ System.out.println("main thread begin priority =" + Thread.currentThread().getPriority());
+ //Thread.currentThread().setPriority(6);
+ System.out.println("main thread end priority =" + Thread.currentThread().getPriority());
+ MyThread17_1 myThread17_1 = new MyThread17_1();
+ myThread17_1.start();
+ }
+}
+
+/*
+//Thread.currentThread().setPriority(6);
+输出:
+main thread begin priority =5
+main thread end priority =5
+MyThread17_1 run priority=5
+MyThread17_2 run priority=5
+
+--------------------
+
+Thread.currentThread().setPriority(6);
+输出:
+main thread begin priority =5
+main thread end priority =6
+MyThread17_1 run priority=6
+MyThread17_2 run priority=6
+
+ */
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run18_priority02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run18_priority02.java
new file mode 100644
index 0000000..2d8f0b4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run18_priority02.java
@@ -0,0 +1,124 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+import java.util.Random;
+
+/**
+ * P45例子
+ * 优先级具有规则性
+ */
+
+class MyThread18_1 extends Thread{
+ @Override
+ public void run() {
+ long beginTime = System.currentTimeMillis();
+ long addResult =0;
+ for (int j=0;j<10;j++){
+ for (int i=0;i<50000;i++){
+ Random random = new Random();
+ random.nextInt();
+ addResult += i;
+ }
+ }
+ long endTime = System.currentTimeMillis();
+ System.out.println("★★★★★ thread1 use time = " + (endTime - beginTime));
+ }
+}
+
+
+class MyThread18_2 extends Thread{
+ @Override
+ public void run() {
+ long beginTime = System.currentTimeMillis();
+ long addResult =0;
+ for (int j=0;j<10;j++){
+ for (int i=0;i<50000;i++){
+ Random random = new Random();
+ random.nextInt();
+ addResult += i;
+ }
+ }
+ long endTime = System.currentTimeMillis();
+ System.out.println("☆☆☆☆☆ thread2 use time = " + (endTime - beginTime));
+ }
+}
+
+public class Run18_priority02 {
+ public static void main(String[] args) {
+ for (int i=0;i<5;i++){
+ MyThread18_1 myThread18_1 =new MyThread18_1();
+ myThread18_1.setPriority(10);
+ //myThread18_1.setPriority(1);
+ myThread18_1.start();
+ MyThread18_2 myThread18_2 =new MyThread18_2();
+ //myThread18_2.setPriority(10);
+ myThread18_2.setPriority(1);
+ myThread18_2.start();
+ }
+ }
+}
+
+
+/*
+myThread18_1.setPriority(10);
+myThread18_2.setPriority(1);
+输出:
+☆☆☆☆☆ thread2 use time = 202
+★★★★★ thread1 use time = 208
+★★★★★ thread1 use time = 255
+★★★★★ thread1 use time = 261
+★★★★★ thread1 use time = 268
+★★★★★ thread1 use time = 270
+☆☆☆☆☆ thread2 use time = 321
+☆☆☆☆☆ thread2 use time = 338
+☆☆☆☆☆ thread2 use time = 344
+☆☆☆☆☆ thread2 use time = 35
+
+-------------------------
+
+★★★★★ thread1 use time = 121
+★★★★★ thread1 use time = 232
+☆☆☆☆☆ thread2 use time = 268
+☆☆☆☆☆ thread2 use time = 292
+★★★★★ thread1 use time = 322
+☆☆☆☆☆ thread2 use time = 325
+★★★★★ thread1 use time = 387
+☆☆☆☆☆ thread2 use time = 390
+★★★★★ thread1 use time = 395
+☆☆☆☆☆ thread2 use time = 409
+
+
+----------------------------------------------------
+----------------------------------------------------
+myThread18_1.setPriority(1);
+myThread18_2.setPriority(10);
+输出:
+
+☆☆☆☆☆ thread2 use time = 393
+☆☆☆☆☆ thread2 use time = 455
+☆☆☆☆☆ thread2 use time = 496
+☆☆☆☆☆ thread2 use time = 509
+☆☆☆☆☆ thread2 use time = 510
+★★★★★ thread1 use time = 511
+★★★★★ thread1 use time = 554
+★★★★★ thread1 use time = 558
+★★★★★ thread1 use time = 561
+★★★★★ thread1 use time = 569
+
+---------------
+
+☆☆☆☆☆ thread2 use time = 214
+☆☆☆☆☆ thread2 use time = 230
+☆☆☆☆☆ thread2 use time = 237
+★★★★★ thread1 use time = 257
+☆☆☆☆☆ thread2 use time = 261
+☆☆☆☆☆ thread2 use time = 271
+★★★★★ thread1 use time = 350
+★★★★★ thread1 use time = 369
+★★★★★ thread1 use time = 339
+★★★★★ thread1 use time = 382
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java
new file mode 100644
index 0000000..a1ee490
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run2_StartVsRun.java
@@ -0,0 +1,47 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P16小例子
+ * myThread2.start()和myThread2.run()的区别
+ */
+
+class MyThread2 extends Thread{
+ public MyThread2(){
+ System.out.println("构造方法打印:"+Thread.currentThread().getName());
+ }
+
+ @Override
+ public void run() {
+ System.out.println("run方法打印:"+ Thread.currentThread().getName());
+ }
+}
+
+public class Run2_StartVsRun {
+ public static void main(String[] args) {
+ MyThread2 myThread2 = new MyThread2();
+ myThread2.start();
+ //myThread2.run();
+ }
+}
+
+
+
+/*
+ myThread2.start();
+//myThread2.run();
+输出:
+构造方法打印:main
+run方法打印:Thread-0
+
+--------------------
+//myThread2.start();
+myThread2.run();
+输出:
+构造方法打印:main
+run方法打印:main
+
+*/
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java
new file mode 100644
index 0000000..2e18fa8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run3_getName.java
@@ -0,0 +1,48 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P17小例子
+ * this.getName()!=Thread.currentThread().getName(),这是两个概念。
+ *
+ */
+class CountOperate extends Thread{
+ public CountOperate(){
+ System.out.println("CountOperate---begin");
+ System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
+ System.out.println("this.getName()="+this.getName());
+ System.out.println("CountOperate---end");
+ }
+
+ @Override
+ public void run() {
+ System.out.println("run---begin");
+ System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
+ System.out.println("this.getName()="+this.getName());
+ System.out.println("run---end");
+ }
+}
+
+public class Run3_getName{
+ public static void main(String[] args) {
+ CountOperate c =new CountOperate();
+ Thread t1 =new Thread(c);
+ t1.setName("A");
+ t1.start();
+ }
+}
+
+/*
+输出:
+CountOperate---begin
+Thread.currentThread().getName()=main
+this.getName()=Thread-0
+CountOperate---end
+run---begin
+Thread.currentThread().getName()=A
+this.getName()=Thread-0
+run---end
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java
new file mode 100644
index 0000000..c05f2d6
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P18
+ * isAlive()
+ *
+ */
+class MyThread4 extends Thread{
+ @Override
+ public void run() {
+ System.out.println("run=" +this.isAlive());
+ }
+}
+
+public class Run4_isAlive01 {
+ public static void main(String[] args) throws InterruptedException{
+ MyThread4 myThread4 = new MyThread4();
+ System.out.println("begin == "+myThread4.isAlive());
+ myThread4.start();
+ //Thread.sleep(1000);
+ System.out.println("end == "+ myThread4.isAlive());
+ }
+
+}
+
+/*
+输出:
+begin == false
+end == true
+run=true
+
+--------------
+Thread.sleep(1000);
+
+输出:
+begin == false
+run=true
+end == false
+
+*/
+
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java
new file mode 100644
index 0000000..9389006
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run5_isAlive02.java
@@ -0,0 +1,60 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P19 小例子
+ * isAlive()方法测试
+ */
+class CountOperate2 extends Thread{
+ public CountOperate2(){
+ System.out.println("CountOperate---begin");
+ System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
+ System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
+ System.out.println("this.getName()="+this.getName());
+ System.out.println("this.isAlive()="+this.isAlive());
+ System.out.println("CountOperate---end");
+ }
+
+ @Override
+ public void run() {
+ System.out.println("run---begin");
+ System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
+ System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
+ System.out.println("this.getName()="+this.getName());
+ System.out.println("this.isAlive()="+this.isAlive());
+ System.out.println("run---end");
+ }
+}
+
+public class Run5_isAlive02{
+ public static void main(String[] args) {
+ CountOperate2 c =new CountOperate2();
+ Thread t1 =new Thread(c);
+ System.out.println("main begin t1 isAlive="+ t1.isAlive());
+ t1.setName("A");
+ t1.start();
+ System.out.println("main end t1 isAlive="+ t1.isAlive());
+ }
+}
+
+/*
+输出:
+CountOperate---begin
+Thread.currentThread().getName()=main
+Thread.currentThread().isAlive()=true
+this.getName()=Thread-0
+this.isAlive()=false
+CountOperate---end
+main begin t1 isAlive=false
+main end t1 isAlive=true
+run---begin
+Thread.currentThread().getName()=A
+Thread.currentThread().isAlive()=true
+this.getName()=Thread-0
+this.isAlive()=false
+run---end
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java
new file mode 100644
index 0000000..4e481d0
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run6_StartVsRun02.java
@@ -0,0 +1,57 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P20~21
+ * sleep()方法测试
+ * run---同步执行
+ * start---异步执行
+ * 所以输出顺序有所不同
+ */
+class MyThread6 extends Thread{
+ @Override
+ public void run() {
+ try {
+ System.out.println("run threadName="+ this.currentThread().getName()+ " begin");
+ Thread.sleep(2000);
+ System.out.println("run threadName="+ this.currentThread().getName()+ " end");
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+public class Run6_StartVsRun02 {
+ public static void main(String[] args) {
+ MyThread6 myThread6 = new MyThread6();
+ System.out.println("begin = "+System.currentTimeMillis());
+ //myThread6.run();
+ myThread6.start();
+ System.out.println("end = "+System.currentTimeMillis());
+ }
+}
+
+/*
+myThread6.run();
+//myThread6.start();
+输出:
+begin = 1460340883191
+run threadName=main begin
+run threadName=main end
+end = 1460340885192
+
+-----------------------
+//myThread6.run();
+myThread6.start();
+输出:
+begin = 1460341011862
+end = 1460341011862
+run threadName=Thread-0 begin
+run threadName=Thread-0 end
+
+*/
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java
new file mode 100644
index 0000000..801c87c
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java
@@ -0,0 +1,37 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P23
+ * 停止线程
+ *
+ */
+
+class MyThread7 extends Thread{
+ @Override
+ public void run() {
+ super.run();
+ for (int i =0;i<500000;i++){
+ System.out.println("i="+(i+1));
+ }
+ }
+}
+
+
+public class Run7_interrupt01 {
+ public static void main(String[] args) {
+ try {
+ MyThread7 myThread7 = new MyThread7();
+ myThread7.start();
+ Thread.sleep(1000);
+ myThread7.interrupt();
+ } catch (InterruptedException e) {
+ System.out.println("main catch");
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run8_interrupted01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run8_interrupted01.java
new file mode 100644
index 0000000..2d144f7
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run8_interrupted01.java
@@ -0,0 +1,69 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P25
+ * 判断线程是否停止状态
+ * 测试当前线程是否已经中断
+ *
+ */
+class MyThread8 extends Thread{
+ @Override
+ public void run() {
+ super.run();
+ for (int i =0;i<500;i++){
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println("i="+(i+1));
+ }
+ }
+}
+
+public class Run8_interrupted01 {
+ public static void main(String[] args) {
+ try {
+ MyThread8 myThread8 = new MyThread8();
+ myThread8.start();
+ Thread.sleep(1000);
+ myThread8.interrupt();
+ System.out.println("Thread.interrupted(),是否停止1?="+Thread.interrupted());
+ System.out.println("Thread.interrupted(),是否停止2?="+Thread.interrupted());
+ } catch (InterruptedException e) {
+ System.out.println("main catch");
+ e.printStackTrace();
+ }
+ System.out.println("end");
+ }
+}
+
+/*
+输出:
+i=1
+i=2
+i=3
+i=4
+i=5
+i=6
+i=7
+i=8
+i=9
+java.lang.InterruptedException: sleep interrupted
+ at java.lang.Thread.sleep(Native Method)
+ at com.brianway.learning.java.multithread.meet.MyThread8.run(Run8_interrupted01.java:18)
+Thread.interrupted(),是否停止1?=false
+Thread.interrupted(),是否停止2?=false
+end
+i=10
+i=11
+省略....
+
+-----------------
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java
new file mode 100644
index 0000000..c88a8a5
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by brian on 2016/4/11.
+ */
+
+/**
+ * P26例子
+ * 线程的中断状态由interrupted()清除
+ */
+public class Run9_interrupted02 {
+ public static void main(String[] args) {
+ Thread.currentThread().interrupt();
+ System.out.println("Thread.interrupted(),是否停止1?="+Thread.interrupted());
+ System.out.println("Thread.interrupted(),是否停止2?="+Thread.interrupted());
+ System.out.println("end");
+ }
+}
+
+/*
+输出:
+Thread.interrupted(),是否停止1?=true
+Thread.interrupted(),是否停止2?=false
+end
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/printMain.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/printMain.java
new file mode 100644
index 0000000..6bb4b44
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/printMain.java
@@ -0,0 +1,19 @@
+package com.brianway.learning.java.multithread.meet;
+
+/**
+ * Created by Brian on 2016/4/10.
+ */
+
+/**
+ * P4的小例子
+ */
+public class printMain {
+ public static void main(String[] args) {
+ System.out.println(Thread.currentThread().getName());
+ }
+}
+
+/*
+output:
+main
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/HasLocalNum.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/HasLocalNum.java
new file mode 100644
index 0000000..399087a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/HasLocalNum.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.synchronize.example1;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+
+public class HasLocalNum {
+ public void addI(String username){
+ try {
+ int num = 0;
+ if(username.equals("a")) {
+ num = 100;
+ System.out.println("a set over");
+ Thread.sleep(1000);
+
+ }else{
+ num = 200;
+ System.out.println("b set over");
+ }
+ 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/example1/Run1_local.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/Run1_local.java
new file mode 100644
index 0000000..eb7c240
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/Run1_local.java
@@ -0,0 +1,31 @@
+package com.brianway.learning.java.multithread.synchronize.example1;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P53例子
+ * 方法内局部变量则不存在“非线程安全”问题
+ *
+ */
+
+public class Run1_local {
+ public static void main(String[] args) {
+ HasLocalNum numRef = new HasLocalNum();
+ ThreadA threadA = new ThreadA(numRef);
+ threadA.start();
+ ThreadB threadB = new ThreadB(numRef);
+ threadB.start();
+ }
+}
+
+
+/*
+输出:
+a set over
+b set over
+b num= 200
+a num= 100
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadA.java
new file mode 100644
index 0000000..91d6e91
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example1;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+public class ThreadA extends Thread{
+ private HasLocalNum numRef;
+ public ThreadA(HasLocalNum numRef){
+ super();
+ this.numRef = numRef;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ numRef.addI("a");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadB.java
new file mode 100644
index 0000000..83b860b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example1;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+public class ThreadB extends Thread{
+ private HasLocalNum numRef;
+ public ThreadB(HasLocalNum numRef){
+ super();
+ this.numRef = numRef;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ numRef.addI("b");
+ }
+}
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
new file mode 100644
index 0000000..ee7ce02
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java
@@ -0,0 +1,25 @@
+package com.brianway.learning.java.multithread.synchronize.example2;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+public class HasSelfPrivateNum {
+ private int num = 0;
+ synchronized
+ public void addI(String username){
+ try {
+ if(username.equals("a")) {
+ num = 100;
+ System.out.println("a set over");
+ Thread.sleep(2000);
+
+ }else{
+ num = 200;
+ System.out.println("b set over");
+ }
+ 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
new file mode 100644
index 0000000..acbd1a0
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java
@@ -0,0 +1,40 @@
+package com.brianway.learning.java.multithread.synchronize.example2;
+
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P55
+ * 实例变量非线程安全
+ */
+public class Run2_private01 {
+ public static void main(String[] args) {
+ HasSelfPrivateNum numRef = new HasSelfPrivateNum();
+ ThreadA threadA = new ThreadA(numRef);
+ threadA.start();
+ ThreadB threadB = new ThreadB(numRef);
+ threadB.start();
+ }
+}
+
+/*
+//synchronized
+ public void addI(String username)
+输出:
+a set over
+b set over
+b num= 200
+a num= 200
+
+---------------
+HasSelfPrivateNum中addI加synchronized
+输出:(注意顺序)
+a set over
+a num= 100
+b set over
+b num= 200
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java
new file mode 100644
index 0000000..cac55a5
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.multithread.synchronize.example2;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+
+/**
+ * P58
+ * 多个对象多个锁
+ * 关键字synchronized取得的都是对象锁
+ * 由于两个对象,所以是两个锁,没有同步问题。运行结果异步
+ */
+public class Run2_twoObject {
+ public static void main(String[] args) {
+ HasSelfPrivateNum numRef1 = new HasSelfPrivateNum();
+ HasSelfPrivateNum numRef2 = new HasSelfPrivateNum();
+ ThreadA threadA = new ThreadA(numRef1);
+ threadA.start();
+ ThreadB threadB = new ThreadB(numRef2);
+ threadB.start();
+ }
+}
+
+
+/*
+synchronized public void addI
+输出:(注意顺序,由于两个对象,所以是两个锁,没有同步问题。运行结果异步)
+a set over
+b set over
+b num= 200
+a num= 100
+*/
\ No newline at end of file
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
new file mode 100644
index 0000000..2772393
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example2;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+public class ThreadA extends Thread{
+ private HasSelfPrivateNum numRef;
+ public ThreadA(HasSelfPrivateNum numRef){
+ super();
+ this.numRef = numRef;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ numRef.addI("a");
+ }
+}
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
new file mode 100644
index 0000000..e35b481
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example2;
+
+/**
+ * Created by Brian on 2016/4/11.
+ */
+public class ThreadB extends Thread{
+ private HasSelfPrivateNum numRef;
+ public ThreadB(HasSelfPrivateNum numRef){
+ super();
+ this.numRef = numRef;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ numRef.addI("b");
+ }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..975879d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ com.brianway.learning.java
+ java-learning
+ pom
+ Java Learning
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ UTF-8
+ 4.11
+
+
+
+ Java学习笔记,主要是对一些基础特性和编程细节进行总结整理。包含示例源码,涉及反射,代理,集合,IO,多线程等。
+
+ https://github.com/brianway/java-learning/
+
+
+
+ brianway
+ Chuyang Wei
+ weichuyang@163.com
+
+
+
+ scm:git:git@github.com:brianway/java-learning.git
+ scm:git:git@github.com:brianway/java-learning.git
+ git@github.com:brianway/java-learning.git
+ HEAD
+
+
+
+
+ Apache License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0
+
+
+
+
+ java-multithread
+ java-base
+
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+
+
+
\ No newline at end of file
From 1bac0db1daa3d47648121e756648638d84681c53 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Tue, 12 Apr 2016 21:47:19 +0800
Subject: [PATCH 03/80] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86java-multithre?=
=?UTF-8?q?ad=E6=A8=A1=E5=9D=97synchronized=E5=8C=85=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E8=87=B3example9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 11 +--
blogs/README.md | 19 ++++++
.../synchronize/example3/MyObject.java | 18 +++++
.../example3/Run3_synchronized01.java | 40 +++++++++++
.../synchronize/example3/ThreadA.java | 18 +++++
.../synchronize/example3/ThreadB.java | 18 +++++
.../synchronize/example4/MyObject.java | 28 ++++++++
.../example4/Run4_synchronized01.java | 43 ++++++++++++
.../synchronize/example4/ThreadA.java | 18 +++++
.../synchronize/example4/ThreadB.java | 18 +++++
.../synchronize/example5/Main.java | 17 +++++
.../synchronize/example5/Run5_lockRein.java | 38 +++++++++++
.../multithread/synchronize/example5/Sub.java | 20 ++++++
.../synchronize/example6/Run6_exception.java | 67 +++++++++++++++++++
.../synchronize/example6/Service.java | 22 ++++++
.../synchronize/example6/ThreadA.java | 18 +++++
.../synchronize/example6/ThreadB.java | 18 +++++
.../synchronize/example7/Main.java | 16 +++++
.../synchronize/example7/MyThread.java | 17 +++++
.../example7/Run7_synNotExtends.java | 47 +++++++++++++
.../multithread/synchronize/example7/Sub.java | 18 +++++
.../synchronize/example8/CommonUtils.java | 11 +++
.../synchronize/example8/MyThreadA.java | 28 ++++++++
.../synchronize/example8/MyThreadB.java | 28 ++++++++
.../example8/Run8_synchronized01.java | 49 ++++++++++++++
.../example8/Run8_synchronized02.java | 47 +++++++++++++
.../synchronize/example8/TaskA.java | 23 +++++++
.../synchronize/example8/TaskB.java | 30 +++++++++
.../synchronize/example9/MyObject.java | 7 ++
.../synchronize/example9/MyObject1.java | 12 ++++
.../synchronize/example9/MyObject2.java | 14 ++++
.../synchronize/example9/MyThread.java | 21 ++++++
.../example9/Run9_synchronized01.java | 37 ++++++++++
.../Run9_synchronized01_twoObjects.java | 34 ++++++++++
.../example9/Run9_synchronized02.java | 41 ++++++++++++
.../example9/Run9_synchronized03.java | 42 ++++++++++++
.../synchronize/example9/Service.java | 19 ++++++
.../synchronize/example9/Thread1.java | 19 ++++++
.../synchronize/example9/Thread2.java | 19 ++++++
pom.xml | 1 +
40 files changed, 1003 insertions(+), 8 deletions(-)
create mode 100644 blogs/README.md
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/MyObject.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/Run4_synchronized01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Run7_synNotExtends.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/CommonUtils.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java
diff --git a/README.md b/README.md
index caeb742..20ca6b3 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,9 @@
# 我的java学习笔记
-
笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解java基础语法,想进一步深入学习的人
+含**博客讲解**和**源码实例**,采用maven构建,分模块学习,涉及反射,代理,多线程,IO,集合类等核心知识。
+
**如果觉得不错,请先在这个仓库上点个star吧**,这也是对我的肯定和鼓励,谢谢了。
不定时进行调整和补充,需要关注更新的请 Watch、Star、Fork
@@ -19,18 +20,12 @@
- [blogs](/blogs):博客文档
- [java-base](/java-base):java基础巩固部分的模块
-- [java-multithread](/java-multithread):多线程部分的模块
+- [java-multithread](/java-multithread):多线程模块
# 博客文档
-笔记分为两大部分:javase和javaweb
-
-- [javase](/blogs/javase)
-- [javaweb](/blogs/javaweb)
-
-
**博客目录**
- [javase](/blogs/javase)
diff --git a/blogs/README.md b/blogs/README.md
new file mode 100644
index 0000000..7ecb5a1
--- /dev/null
+++ b/blogs/README.md
@@ -0,0 +1,19 @@
+# 博客目录
+
+- [javase](/blogs/javase)
+ - [java基础巩固笔记(1)-反射.md](/blogs/javase/java基础巩固笔记(1)-反射.md)
+ - [java基础巩固笔记(2)-泛型.md](/blogs/javase/java基础巩固笔记(2)-泛型.md)
+ - [java基础巩固笔记(3)-类加载器.md](/blogs/javase/java基础巩固笔记(3)-类加载器.md)
+ - [java基础巩固笔记(4)-代理.md](/blogs/javase/java基础巩固笔记(4)-代理.md)
+ - [java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md](/blogs/javase/java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md)
+ - [java基础巩固笔记(5)-多线程之传统多线程.md](/blogs/javase/java基础巩固笔记(5)-多线程之传统多线程.md)
+ - [java基础巩固笔记(5)-多线程之共享数据.md](/blogs/javase/java基础巩固笔记(5)-多线程之共享数据.md)
+ - [java基础巩固笔记(5)-多线程之线程并发库.md](/blogs/javase/java基础巩固笔记(5)-多线程之线程并发库.md)
+ - [java基础巩固笔记(6)-注解.md](/blogs/javase/java基础巩固笔记(6)-注解.md)
+- [javaweb](/blogs/javaweb)
+ - [javaweb入门笔记(1)-Tomcat.md](/blogs/javaweb/javaweb入门笔记(1)-Tomcat.md)
+ - [javaweb入门笔记(2)-http入门.md](/blogs/javaweb/javaweb入门笔记(2)-http入门.md)
+ - [javaweb入门笔记(3)-Servlet.md](/blogs/javaweb/javaweb入门笔记(3)-Servlet.md)
+ - [javaweb入门笔记(4)-request和response.md](/blogs/javaweb/javaweb入门笔记(4)-request和response.md)
+ - [javaweb入门笔记(5)-cookie和session.md](/blogs/javaweb/javaweb入门笔记(5)-cookie和session.md)
+ - [javaweb入门笔记(6)-JSP技术.md](/blogs/javaweb/javaweb入门笔记(6)-JSP技术.md)
\ No newline at end of file
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
new file mode 100644
index 0000000..9a3f829
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example3;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+public class MyObject {
+ synchronized
+ public void methodA(){
+ try {
+ System.out.println("begin methodA threadName="+Thread.currentThread().getName());
+ Thread.sleep(5000);
+ 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/Run3_synchronized01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java
new file mode 100644
index 0000000..d868848
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java
@@ -0,0 +1,40 @@
+package com.brianway.learning.java.multithread.synchronize.example3;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P60
+ * synchronized方法与锁对象
+ */
+public class Run3_synchronized01 {
+ public static void main(String[] args) {
+ MyObject object = new MyObject();
+ ThreadA a = new ThreadA(object);
+ a.setName("A");
+ ThreadB b = new ThreadB(object);
+ b.setName("B");
+ a.start();
+ b.start();
+ }
+}
+
+/*
+public void methodA()没加synchronized
+输出:
+begin methodA threadName=B
+begin methodA threadName=A
+A end
+B end
+
+-------------------
+
+public void methodA()加synchronized
+输出:
+begin methodA threadName=A
+A end
+begin methodA threadName=B
+B end
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..b6efb1a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example3;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class ThreadA extends Thread{
+ private MyObject object;
+ public ThreadA(MyObject object){
+ super();
+ this.object = object;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ object.methodA();
+ }
+}
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
new file mode 100644
index 0000000..bc2e353
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example3;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class ThreadB extends Thread{
+ private MyObject object;
+ public ThreadB(MyObject object){
+ super();
+ this.object = object;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ object.methodA();
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..70accb8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/MyObject.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java.multithread.synchronize.example4;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+public class MyObject {
+ synchronized public void methodA(){
+ try {
+ System.out.println("begin methodA threadName="+Thread.currentThread().getName());
+ Thread.sleep(5000);
+ System.out.println(Thread.currentThread().getName()+" endTime:"+System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ synchronized
+ public void methodB(){
+ try {
+ System.out.println("begin methodB threadName="+Thread.currentThread().getName());
+ Thread.sleep(5000);
+ 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/Run4_synchronized01.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/Run4_synchronized01.java
new file mode 100644
index 0000000..6310135
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/Run4_synchronized01.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.multithread.synchronize.example4;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P63
+ * 两个线程访问同一个对象的不同方法
+ * 1.一个方法有synchronized,一个没有。线程B可异步调用非synchronized类型方法
+ * 2.两个都有synchronized。线程B需等待
+ */
+public class Run4_synchronized01 {
+ public static void main(String[] args) {
+ MyObject object = new MyObject();
+ ThreadA a = new ThreadA(object);
+ a.setName("A");
+ ThreadB b = new ThreadB(object);
+ b.setName("B");
+ a.start();
+ b.start();
+ }
+}
+
+/*
+public void methodB()没加synchronized
+输出:
+begin methodA threadName=A
+begin methodB threadName=B
+A endTime:1460449260181
+B endTime:1460449260181
+
+-------------------
+
+public void methodB()加synchronized
+输出:
+begin methodA threadName=A
+A endTime:1460449301441
+begin methodB threadName=B
+B endTime:1460449306441
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..e213e58
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example4;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class ThreadA extends Thread{
+ private MyObject object;
+ public ThreadA(MyObject object){
+ super();
+ this.object = object;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ object.methodA();
+ }
+}
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
new file mode 100644
index 0000000..61b5860
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example4;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class ThreadB extends Thread{
+ private MyObject object;
+ public ThreadB(MyObject object){
+ super();
+ this.object = object;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ object.methodB();
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..92c851b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.synchronize.example5;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Main {
+ protected int i = 10;
+ synchronized public void operateIinMain(){
+ try {
+ 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
new file mode 100644
index 0000000..6565c54
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.synchronize.example5;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P67
+ * synchronized锁重入,支持继承
+ */
+public class Run5_lockRein {
+ public static void main(String[] args) {
+ Thread t = new Thread(){
+ @Override
+ public void run() {
+ Sub sub = new Sub();
+ sub.operateIinSub();
+ }
+ };
+ t.start();
+
+ }
+
+}
+
+/*
+输出:
+sub print i=9
+main print i=8
+sub print i=7
+main print i=6
+sub print i=5
+main print i=4
+sub print i=3
+main print i=2
+sub print i=1
+main print i=0
+ */
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
new file mode 100644
index 0000000..445ed67
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.synchronize.example5;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Sub extends Main{
+ synchronized public void operateIinSub(){
+ try {
+ while (i>0){
+ i--;
+ System.out.println("sub print i="+i);
+ Thread.sleep(100);
+ this.operateIinMain();
+ }
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
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
new file mode 100644
index 0000000..c0b5660
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Run6_exception.java
@@ -0,0 +1,67 @@
+package com.brianway.learning.java.multithread.synchronize.example6;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P68
+ * 出现异常,锁自动释放
+ */
+public class Run6_exception {
+ public static void main(String[] args) {
+
+ try {
+ Service service = new Service();
+ ThreadA a = new ThreadA("a",service);
+ a.start();
+ Thread.sleep(500);
+ ThreadB b = new ThreadB("b",service);
+ b.start();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
+
+
+/*
+输出:
+ThreadName=a run beginTime=1460455843215
+Exception in thread "a" java.lang.NumberFormatException: For input string: "a"
+ThreadName=a run exceptionTime=1460455843719
+ at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
+Thread b run Time=1460455843719
+ at java.lang.Integer.parseInt(Integer.java:580)
+ at java.lang.Integer.parseInt(Integer.java:615)
+ at com.brianway.learning.java.multithread.synchronize.example6.Service.testMethod(Service.java:15)
+ at com.brianway.learning.java.multithread.synchronize.example6.ThreadA.run(ThreadA.java:16)
+
+---------------
+
+ThreadName=a run beginTime=1460455874981
+ThreadName=a run exceptionTime=1460455875079
+Exception in thread "a" java.lang.NumberFormatException: For input string: "a"
+ at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
+ at java.lang.Integer.parseInt(Integer.java:580)
+ at java.lang.Integer.parseInt(Integer.java:615)
+ at com.brianway.learning.java.multithread.synchronize.example6.Service.testMethod(Service.java:15)
+ at com.brianway.learning.java.multithread.synchronize.example6.ThreadA.run(ThreadA.java:16)
+Thread b run Time=1460455875480
+
+
+
+---------
+
+
+ThreadName=a run beginTime=1460455887793
+Exception in thread "a" java.lang.NumberFormatException: For input string: "a"
+ at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
+ at java.lang.Integer.parseInt(Integer.java:580)
+ at java.lang.Integer.parseInt(Integer.java:615)
+ at com.brianway.learning.java.multithread.synchronize.example6.Service.testMethod(Service.java:15)
+ at com.brianway.learning.java.multithread.synchronize.example6.ThreadA.run(ThreadA.java:16)
+ThreadName=a run exceptionTime=1460455887945
+Thread b run Time=1460455888293
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..77c166a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.multithread.synchronize.example6;
+
+/**
+ * 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());
+
+ 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());
+ Integer.parseInt("a");
+ }
+ }
+ }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
new file mode 100644
index 0000000..933a437
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example6;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class ThreadA extends Thread{
+ private Service service;
+
+ public ThreadA(String name, Service service) {
+ super(name);
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.testMethod();
+ }
+}
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
new file mode 100644
index 0000000..fc4f458
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example6;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class ThreadB extends Thread{
+ private Service service;
+
+ public ThreadB(String name, Service service) {
+ super(name);
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.testMethod();
+ }
+}
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
new file mode 100644
index 0000000..a0db493
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.multithread.synchronize.example7;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Main {
+ synchronized public void testMethod(){
+ try {
+ 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());
+ } 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
new file mode 100644
index 0000000..7bb4f1f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.synchronize.example7;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class MyThread extends Thread{
+ private Sub sub;
+ public MyThread(Sub sub){
+ super();
+ this.sub= sub;
+ }
+
+ @Override
+ public void run() {
+ sub.testMethod();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Run7_synNotExtends.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Run7_synNotExtends.java
new file mode 100644
index 0000000..122ec56
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Run7_synNotExtends.java
@@ -0,0 +1,47 @@
+package com.brianway.learning.java.multithread.synchronize.example7;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P71
+ * 同步不具继承性
+ */
+public class Run7_synNotExtends {
+ public static void main(String[] args) {
+ Sub sub = new Sub();
+ MyThread a = new MyThread(sub);
+ a.setName("A");
+ a.start();
+ MyThread b = new MyThread(sub);
+ b.setName("B");
+ b.start();
+ }
+}
+
+/*
+Sub的testMethod不加synchronized
+输出:
+threadName= A in sub 下一步 sleep begin time =1460457287103
+threadName= B in sub 下一步 sleep begin time =1460457287103
+threadName= A in sub 下一步 sleep end time =1460457289103
+threadName= B in sub 下一步 sleep end time =1460457289103
+threadName= A in main 下一步 sleep begin time =1460457289103
+threadName= A in main 下一步 sleep end time =1460457291103
+threadName= B in main 下一步 sleep begin time =1460457291103
+threadName= B in main 下一步 sleep end time =1460457293103
+
+--------------------
+Sub的testMethod加synchronized
+输出:
+threadName= A in sub 下一步 sleep begin time =1460457463877
+threadName= A in sub 下一步 sleep end time =1460457465878
+threadName= A in main 下一步 sleep begin time =1460457465878
+threadName= A in main 下一步 sleep end time =1460457470879
+threadName= B in sub 下一步 sleep begin time =1460457470879
+threadName= B in sub 下一步 sleep end time =1460457472879
+threadName= B in main 下一步 sleep begin time =1460457472879
+threadName= B in main 下一步 sleep end time =1460457477879
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..3e9976a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example7;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Sub extends Main{
+ //synchronized
+ public void testMethod(){
+ try {
+ 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());
+ super.testMethod();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/CommonUtils.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/CommonUtils.java
new file mode 100644
index 0000000..54592f7
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/CommonUtils.java
@@ -0,0 +1,11 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class CommonUtils {
+ public static long beginTime1;
+ public static long endTime1;
+ public static long beginTime2;
+ public static long endTime2;
+}
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
new file mode 100644
index 0000000..a9d3edf
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class MyThreadA extends Thread{
+ private 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();
+ taskA.doLongTimeTask();
+ CommonUtils.endTime1 = System.currentTimeMillis();
+ }else if(this.getName().equals("b")){
+ CommonUtils.beginTime2= System.currentTimeMillis();
+ taskA.doLongTimeTask();
+ CommonUtils.endTime2 = System.currentTimeMillis();
+ }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
new file mode 100644
index 0000000..4d5ab4d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class MyThreadB extends Thread{
+ private 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();
+ taskB.doLongTimeTask();
+ CommonUtils.endTime1 = System.currentTimeMillis();
+ }else if(this.getName().equals("d")){
+ CommonUtils.beginTime2= System.currentTimeMillis();
+ taskB.doLongTimeTask();
+ CommonUtils.endTime2 = System.currentTimeMillis();
+ }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
new file mode 100644
index 0000000..e810f93
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized01.java
@@ -0,0 +1,49 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P72
+ * synchronized方法的弊端
+ */
+public class Run8_synchronized01 {
+ public static void main(String[] args) {
+ TaskA taskA = new TaskA();
+ MyThreadA thread1 =new MyThreadA(taskA);
+ thread1.setName("a");
+ thread1.start();
+
+ MyThreadA thread2 =new MyThreadA(taskA);
+ thread2.setName("b");
+ thread2.start();
+
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ long beginTime = CommonUtils.beginTime2CommonUtils.endTime2?CommonUtils.endTime1:CommonUtils.endTime2;
+ System.out.println("耗时:"+(endTime-beginTime)/1000);
+ }
+
+
+}
+
+
+/*
+输出:
+begin task
+长时间处理任务后从远程返回的值1 threadName=a
+长时间处理任务后从远程返回的值2 threadName=a
+end task
+begin task
+长时间处理任务后从远程返回的值1 threadName=b
+长时间处理任务后从远程返回的值2 threadName=b
+end task
+耗时:6
+
+ */
\ 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
new file mode 100644
index 0000000..2a2a1ba
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/Run8_synchronized02.java
@@ -0,0 +1,47 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P76
+ * 同步代码块解决同步方法的弊端
+ * 但输出并不是两个c,两个d,原因?
+ */
+public class Run8_synchronized02 {
+ public static void main(String[] args) {
+ TaskB taskB = new TaskB();
+ MyThreadB thread1 =new MyThreadB(taskB);
+ thread1.setName("c");
+ thread1.start();
+
+ MyThreadB thread2 =new MyThreadB(taskB);
+ thread2.setName("d");
+ thread2.start();
+
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ long beginTime = CommonUtils.beginTime2CommonUtils.endTime2?CommonUtils.endTime1:CommonUtils.endTime2;
+ System.out.println("耗时:"+(endTime-beginTime)/1000);
+ }
+
+}
+
+/*
+输出:
+begin task
+begin task
+长时间处理任务后从远程返回的值1 threadName=c
+长时间处理任务后从远程返回的值2 threadName=d
+end task
+长时间处理任务后从远程返回的值1 threadName=d
+长时间处理任务后从远程返回的值2 threadName=d
+end task
+耗时:3
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..a2fe05f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java
@@ -0,0 +1,23 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class TaskA {
+ private String getData1;
+ private String getData2;
+
+ 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();
+ System.out.println(getData1);
+ System.out.println(getData2);
+ System.out.println("end task");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
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
new file mode 100644
index 0000000..0bc640b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskB.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.synchronize.example8;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class TaskB {
+ private String getData1;
+ private String getData2;
+
+ 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){
+ //System.out.println("切换到线程begin:"+Thread.currentThread().getName());
+ getData1 = privateGetData1;
+ getData2 = privateGetData2;
+ //System.out.println("切换到线程end:"+Thread.currentThread().getName());
+ }
+
+ System.out.println(getData1);
+ System.out.println(getData2);
+ System.out.println("end task");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject.java
new file mode 100644
index 0000000..4993a22
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject.java
@@ -0,0 +1,7 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class MyObject {
+}
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
new file mode 100644
index 0000000..b308bed
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * 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());
+ System.out.println("*******************");
+ 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
new file mode 100644
index 0000000..d9474f4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * 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());
+ System.out.println("*******************");
+ 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
new file mode 100644
index 0000000..bd3cb2f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java
@@ -0,0 +1,21 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class MyThread extends Thread{
+ private Service service;
+ private MyObject object;
+
+ public MyThread(Service service,MyObject object) {
+ super();
+ this.object = object;
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ service.testMethod1(object);
+ }
+}
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
new file mode 100644
index 0000000..89cb151
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01.java
@@ -0,0 +1,37 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P91
+ * synchronized(非this对象x)的三个结论
+ * 1)当多个线程同时执行synchronized(x){}同步代码块时呈现效果
+ * 2)当其他线程执行x对象中synchronized同步方法时呈同步效果
+ * 3)当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ * 验证结论1:
+ * 当多个线程同时执行synchronized(x){}同步代码块时呈现效果
+ */
+public class Run9_synchronized01 {
+ public static void main(String[] args) {
+ Service service = new Service();
+ MyObject object = new MyObject();
+
+ MyThread a = new MyThread(service,object);
+ a.setName("a");
+ a.start();
+ MyThread b = new MyThread(service,object);
+ b.setName("b");
+ b.start();
+
+ }
+}
+
+/*
+输出:
+testMethod1 ____getLock time=1460467206978 run ThreadName=a
+testMethod1 releaseLock time=1460467208978 run ThreadName=a
+testMethod1 ____getLock time=1460467208978 run ThreadName=b
+testMethod1 releaseLock time=1460467210978 run ThreadName=b
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..4c5ccf5
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized01_twoObjects.java
@@ -0,0 +1,34 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P93
+ * 不同的“对象监视器”
+ */
+public class Run9_synchronized01_twoObjects {
+ public static void main(String[] args) {
+ Service service = new Service();
+ MyObject object1 = new MyObject();
+ MyObject object2 = new MyObject();
+
+ MyThread a = new MyThread(service,object1);
+ a.setName("a");
+ a.start();
+ MyThread b = new MyThread(service,object2);
+ b.setName("b");
+ b.start();
+
+ }
+}
+
+/*
+输出:
+testMethod1 ____getLock time=1460467346174 run ThreadName=a
+testMethod1 ____getLock time=1460467346174 run ThreadName=b
+testMethod1 releaseLock time=1460467348174 run ThreadName=a
+testMethod1 releaseLock time=1460467348174 run ThreadName=b
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..deef8bb
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized02.java
@@ -0,0 +1,41 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P93
+ * synchronized(非this对象x)的三个结论
+ * 1)当多个线程同时执行synchronized(x){}同步代码块时呈现效果
+ * 2)当其他线程执行x对象中synchronized同步方法时呈同步效果
+ * 3)当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ * 验证结论2:
+ * 当其他线程执行x对象中synchronized同步方法时呈同步效果
+ */
+public class Run9_synchronized02 {
+ public static void main(String[] args) {
+ Service service = new Service();
+ MyObject1 object1 = new MyObject1();
+
+ MyThread a = new MyThread(service,object1);
+ a.setName("a");
+ a.start();
+ Thread1 b = new Thread1(object1);
+ b.setName("b");
+ b.start();
+
+ }
+
+}
+
+
+/*
+输出:
+testMethod1 ____getLock time=1460468427929 run ThreadName=a
+testMethod1 releaseLock time=1460468429930 run ThreadName=a
+speedPrintString ____getLock time=1460468429930 run ThreadName=b
+*******************
+speedPrintString releaseLock time=1460468429930 run ThreadName=b
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..4656f88
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Run9_synchronized03.java
@@ -0,0 +1,42 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+
+/**
+ * P95
+ * synchronized(非this对象x)的三个结论
+ * 1)当多个线程同时执行synchronized(x){}同步代码块时呈现效果
+ * 2)当其他线程执行x对象中synchronized同步方法时呈同步效果
+ * 3)当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ * 验证结论1:
+ * 当其他线程执行x对象里面的ynchronized(this)代码块时,也呈现同步效果
+ */
+
+public class Run9_synchronized03 {
+ public static void main(String[] args) {
+ Service service = new Service();
+ MyObject2 object2 = new MyObject2();
+
+ MyThread a = new MyThread(service,object2);
+ a.setName("a");
+ a.start();
+ Thread2 b = new Thread2(object2);
+ b.setName("b");
+ b.start();
+
+ }
+
+}
+
+
+/*
+输出:
+testMethod1 ____getLock time=1460468687415 run ThreadName=a
+testMethod1 releaseLock time=1460468689415 run ThreadName=a
+speedPrintString ____getLock time=1460468689415 run ThreadName=b
+*******************
+speedPrintString releaseLock time=1460468689415 run ThreadName=b
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..d021668
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java
@@ -0,0 +1,19 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Service {
+ public void testMethod1(MyObject object){
+ synchronized (object){
+ try {
+ 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());
+ } 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
new file mode 100644
index 0000000..c0a2eb2
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java
@@ -0,0 +1,19 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Thread1 extends Thread{
+ private MyObject1 object1;
+
+
+ public Thread1(MyObject1 object1) {
+ this.object1 = object1;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ object1.speedPrintString();
+ }
+}
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
new file mode 100644
index 0000000..31ef386
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java
@@ -0,0 +1,19 @@
+package com.brianway.learning.java.multithread.synchronize.example9;
+
+/**
+ * Created by Brian on 2016/4/12.
+ */
+public class Thread2 extends Thread{
+ private MyObject2 object2;
+
+
+ public Thread2(MyObject2 object2) {
+ this.object2 = object2;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ object2.speedPrintString();
+ }
+}
diff --git a/pom.xml b/pom.xml
index 975879d..0ec62fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,7 @@
weichuyang@163.com
+
scm:git:git@github.com:brianway/java-learning.git
scm:git:git@github.com:brianway/java-learning.git
From efe41c44310051e1d44979fa952d880dfadd467f Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 13 Apr 2016 01:02:45 +0800
Subject: [PATCH 04/80] =?UTF-8?q?java-multihread=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E8=87=B3example10?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 11 ++-
.../Run10_synBlockMoreObjectOneLock.java | 97 +++++++++++++++++++
.../Run10_synMoreObjectStaticOneLock.java | 32 ++++++
.../exmaple10/Run10_synTwoLock.java | 37 +++++++
.../synchronize/exmaple10/Service.java | 27 ++++++
.../synchronize/exmaple10/ServiceSub.java | 30 ++++++
.../synchronize/exmaple10/ServiceSub2.java | 22 +++++
.../synchronize/exmaple10/ThreadA.java | 18 ++++
.../synchronize/exmaple10/ThreadB.java | 18 ++++
.../synchronize/exmaple10/ThreadC.java | 18 ++++
10 files changed, 305 insertions(+), 5 deletions(-)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java
diff --git a/README.md b/README.md
index 20ca6b3..0cdf658 100644
--- a/README.md
+++ b/README.md
@@ -8,11 +8,6 @@
不定时进行调整和补充,需要关注更新的请 Watch、Star、Fork
-如果你只是单纯要阅读的话,建议移步CSDN或者oschina上观看,访问速度快很多:
-
->* CSDN:[我的java&javaweb学习笔记(汇总)](http://blog.csdn.net/h3243212/article/details/50659471)
->* oschina:[我的java&javaweb学习笔记(汇总)](http://my.oschina.net/brianway/blog/614355)
-
-----
@@ -26,6 +21,12 @@
# 博客文档
+如果你只是单纯要阅读的话,建议移步CSDN或者oschina上观看,访问速度快很多:
+
+>* CSDN:[我的java&javaweb学习笔记(汇总)](http://blog.csdn.net/h3243212/article/details/50659471)
+>* oschina:[我的java&javaweb学习笔记(汇总)](http://my.oschina.net/brianway/blog/614355)
+
+
**博客目录**
- [javase](/blogs/javase)
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java
new file mode 100644
index 0000000..22e6b20
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java
@@ -0,0 +1,97 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+
+import org.omg.CORBA.PUBLIC_MEMBER;
+
+/**
+ * P101
+ * 验证同步sychronized(class)代码块的作用
+ * 顺便验证了下static方法是不能复写的
+ * @see ServiceSub,ServiceSub2
+ */
+public class Run10_synBlockMoreObjectOneLock {
+ public static void main(String[] args) {
+ //testSub();
+ //testSub2();
+ testBlock();
+ }
+
+ /**
+ * 验证同步sychronized(class)代码块的作用
+ */
+ public static void testBlock(){
+ final ServiceSub service1 = new ServiceSub();
+ final ServiceSub service2 = new ServiceSub();
+
+ Thread a = new Thread(){
+ @Override
+ public void run() {
+ service1.printA();
+ }
+ };
+ a.setName("A");
+ a.start();
+ Thread b = new Thread(){
+ @Override
+ public void run() {
+ service2.printB();
+ }
+ };
+ b.setName("B");
+ b.start();
+ }
+
+ /**
+ * testSub断点调试结果是运行的Service类的printA方法
+ */
+ public static void testSub(){
+ ServiceSub service1 = new ServiceSub();
+ ServiceSub service2 = new ServiceSub();
+
+ ThreadA a = new ThreadA(service1);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(service2);
+ b.setName("B");
+ b.start();
+ }
+
+ /**
+ * testSub2断点调试结果是运行的Service类的printA方法
+ */
+ public static void testSub2(){
+ ServiceSub2 service1 = new ServiceSub2();
+ ServiceSub2 service2 = new ServiceSub2();
+
+ ThreadA a = new ThreadA(service1);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(service2);
+ b.setName("B");
+ b.start();
+ }
+
+
+}
+
+
+/*
+输出:
+In ServiceSub
+线程名:A 在 1460480421944进入printA
+线程名:A 在 1460480423944离开printA
+线程名:B 在 1460480423944进入printB
+线程名:B 在 1460480423944离开printB
+
+---------
+也可能:
+线程名:B 在 1460480476089进入printB
+线程名:B 在 1460480476089离开printB
+In ServiceSub
+线程名:A 在 1460480476089进入printA
+线程名:A 在 1460480478089离开printA
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java
new file mode 100644
index 0000000..e0ea47f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+
+/**
+ * P100
+ * Class锁可以对类的所有对象实例起作用
+ */
+public class Run10_synMoreObjectStaticOneLock {
+ public static void main(String[] args) {
+ Service service1 = new Service();
+ Service service2 = new Service();
+
+ ThreadA a = new ThreadA(service1);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(service2);
+ b.setName("B");
+ b.start();
+
+ }
+}
+
+/*
+输出:
+线程名:A 在 1460479094611进入printA
+线程名:A 在 1460479097611离开printA
+线程名:B 在 1460479097611进入printB
+线程名:B 在 1460479097611离开printB
+ */
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java
new file mode 100644
index 0000000..c7b116c
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java
@@ -0,0 +1,37 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+
+
+/**
+ * P97
+ * 验证synchronized关键字加载static静态方法和加到非静态方法不是同一个锁
+ * 一个是Class类上锁,一个是对象上锁
+ */
+public class Run10_synTwoLock {
+ public static void main(String[] args) {
+ Service service = new Service();
+
+ ThreadA a = new ThreadA(service);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(service);
+ b.setName("B");
+ b.start();
+ ThreadC c =new ThreadC(service);
+ c.setName("C");
+ c.start();
+ }
+}
+
+/*
+输出:
+线程名:A 在 1460478479803进入printA
+线程名:C 在 1460478479808进入printC
+线程名:C 在 1460478479808离开printC
+线程名:A 在 1460478482804离开printA
+线程名:B 在 1460478482804进入printB
+线程名:B 在 1460478482804离开printB
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java
new file mode 100644
index 0000000..82ae08b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java
@@ -0,0 +1,27 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+
+public class Service {
+ synchronized public static void printA(){
+ try {
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printA");
+ Thread.sleep(3000);
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printA");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ synchronized public static void printB(){
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printB");
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printB");
+ }
+
+ synchronized public void printC(){
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printC");
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printC");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java
new file mode 100644
index 0000000..7676e5a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+public class ServiceSub extends Service {
+
+ public static void printA(){
+ synchronized (ServiceSub.class){
+ try {
+ System.out.println("In ServiceSub");
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printA");
+ Thread.sleep(2000);
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printA");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void printB(){
+ synchronized (ServiceSub.class){
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printB");
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printB");
+ }
+
+ }
+
+
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java
new file mode 100644
index 0000000..2b7edfe
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+public class ServiceSub2 extends Service{
+ synchronized public static void printA(){
+ try {
+ System.out.println("ServiceSub2");
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printA");
+ Thread.sleep(1000);
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printA");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ synchronized public static void printB(){
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"进入printB");
+ System.out.println("线程名:"+Thread.currentThread().getName()+" 在 "+ System.currentTimeMillis()+"离开printB");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java
new file mode 100644
index 0000000..99033bc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+public class ThreadA extends Thread {
+ private Service service;
+
+ public ThreadA(Service service) {
+ super();
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.printA();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java
new file mode 100644
index 0000000..f2e4ab4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+public class ThreadB extends Thread {
+ private Service service;
+
+ public ThreadB(Service service) {
+ super();
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.printB();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java
new file mode 100644
index 0000000..26212b1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.exmaple10;
+
+/**
+ * Created by brian on 2016/4/13.
+ */
+public class ThreadC extends Thread {
+ private Service service;
+
+ public ThreadC(Service service) {
+ super();
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.printC();
+ }
+}
From 176fdcd16179028580fe0422646a414be779eb26 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 13 Apr 2016 16:36:38 +0800
Subject: [PATCH 05/80] =?UTF-8?q?java-multihread=20=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E8=87=B3=20example14?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../learning/java/base/HelloWorld.java | 10 +
.../Run10_synBlockMoreObjectOneLock.java | 4 +-
.../Run10_synMoreObjectStaticOneLock.java | 2 +-
.../Run10_synTwoLock.java | 2 +-
.../{exmaple10 => example10}/Service.java | 2 +-
.../{exmaple10 => example10}/ServiceSub.java | 2 +-
.../{exmaple10 => example10}/ServiceSub2.java | 2 +-
.../{exmaple10 => example10}/ThreadA.java | 2 +-
.../{exmaple10 => example10}/ThreadB.java | 2 +-
.../{exmaple10 => example10}/ThreadC.java | 2 +-
.../example11/Run11_StringAndSyn.java | 36 ++++
.../example11/Run11_StringAndSyn2.java | 41 ++++
.../synchronize/example11/ServiceA.java | 20 ++
.../synchronize/example11/ServiceB.java | 20 ++
.../synchronize/example11/ThreadA.java | 18 ++
.../synchronize/example11/ThreadB.java | 18 ++
.../synchronize/example12/DealThread.java | 46 ++++
.../synchronize/example12/Run12_deadLock.java | 198 ++++++++++++++++++
.../synchronize/example13/OutClass.java | 32 +++
.../synchronize/example13/OutClass2.java | 59 ++++++
.../synchronize/example13/Run13_inner01.java | 54 +++++
.../synchronize/example13/Run13_inner02.java | 166 +++++++++++++++
.../example14/Run14_setNewStringTwoLock.java | 53 +++++
.../synchronize/example14/Service.java | 22 ++
24 files changed, 802 insertions(+), 11 deletions(-)
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/HelloWorld.java
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/Run10_synBlockMoreObjectOneLock.java (95%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/Run10_synMoreObjectStaticOneLock.java (91%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/Run10_synTwoLock.java (93%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/Service.java (94%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/ServiceSub.java (94%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/ServiceSub2.java (93%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/ThreadA.java (81%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/ThreadB.java (81%)
rename java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/{exmaple10 => example10}/ThreadC.java (81%)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/DealThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java
diff --git a/java-base/src/main/java/com/brianway/learning/java/base/HelloWorld.java b/java-base/src/main/java/com/brianway/learning/java/base/HelloWorld.java
new file mode 100644
index 0000000..bd6a35e
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/HelloWorld.java
@@ -0,0 +1,10 @@
+package com.brianway.learning.java.base;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class HelloWorld {
+ public static void main(String[] args) {
+ System.out.println("Hello World");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java
similarity index 95%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java
index 22e6b20..f3e2279 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synBlockMoreObjectOneLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synBlockMoreObjectOneLock.java
@@ -1,11 +1,9 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
*/
-import org.omg.CORBA.PUBLIC_MEMBER;
-
/**
* P101
* 验证同步sychronized(class)代码块的作用
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synMoreObjectStaticOneLock.java
similarity index 91%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synMoreObjectStaticOneLock.java
index e0ea47f..12176a4 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synMoreObjectStaticOneLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synMoreObjectStaticOneLock.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synTwoLock.java
similarity index 93%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synTwoLock.java
index c7b116c..7685227 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Run10_synTwoLock.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synTwoLock.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Service.java
similarity index 94%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Service.java
index 82ae08b..9f316ba 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/Service.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Service.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ServiceSub.java
similarity index 94%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ServiceSub.java
index 7676e5a..e8dc10b 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ServiceSub.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ServiceSub2.java
similarity index 93%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ServiceSub2.java
index 2b7edfe..495de83 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ServiceSub2.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ServiceSub2.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadA.java
similarity index 81%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadA.java
index 99033bc..7a229b1 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadA.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadA.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadB.java
similarity index 81%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadB.java
index f2e4ab4..a07d541 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadB.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadB.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadC.java
similarity index 81%
rename from java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java
rename to java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadC.java
index 26212b1..37c44f9 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/exmaple10/ThreadC.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadC.java
@@ -1,4 +1,4 @@
-package com.brianway.learning.java.multithread.synchronize.exmaple10;
+package com.brianway.learning.java.multithread.synchronize.example10;
/**
* Created by brian on 2016/4/13.
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java
new file mode 100644
index 0000000..3fbb03e
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java
@@ -0,0 +1,36 @@
+package com.brianway.learning.java.multithread.synchronize.example11;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P102
+ * String作为锁对象
+ * 常量池->同一锁
+ */
+public class Run11_StringAndSyn {
+ public static void main(String[] args) {
+ ServiceA serviceA = new ServiceA();
+ ThreadA a =new ThreadA(serviceA);
+ a.setName("A");
+ a.start();
+ ThreadA b = new ThreadA(serviceA);
+ b.setName("B");
+ b.start();
+ }
+}
+
+
+/*
+输出:
+A
+A
+A
+A
+A
+A
+A
+A
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java
new file mode 100644
index 0000000..ce524d5
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java
@@ -0,0 +1,41 @@
+package com.brianway.learning.java.multithread.synchronize.example11;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P104
+ * 不使用String作为锁对象
+ */
+public class Run11_StringAndSyn2 {
+ public static void main(String[] args) {
+ ServiceB serviceB = new ServiceB();
+ ThreadB a =new ThreadB(serviceB);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(serviceB);
+ b.setName("B");
+ b.start();
+ }
+}
+
+
+/*
+输出:
+A
+B
+B
+A
+A
+B
+A
+B
+A
+B
+B
+A
+A
+B
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceA.java
new file mode 100644
index 0000000..fa738af
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceA.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.synchronize.example11;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class ServiceA {
+ public static void print(String stringParam){
+ try {
+ synchronized (stringParam) {
+ while (true) {
+ System.out.println(Thread.currentThread().getName());
+ Thread.sleep(1000);
+ }
+ }
+ }catch(InterruptedException e){
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceB.java
new file mode 100644
index 0000000..792264d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceB.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.synchronize.example11;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class ServiceB {
+ public static void print(Object object){
+ try {
+ synchronized (object) {
+ while (true) {
+ System.out.println(Thread.currentThread().getName());
+ Thread.sleep(500);
+ }
+ }
+ }catch(InterruptedException e){
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadA.java
new file mode 100644
index 0000000..bb150b8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example11;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class ThreadA extends Thread {
+ ServiceA serviceA;
+
+ public ThreadA(ServiceA serviceA) {
+ super();
+ this.serviceA = serviceA;
+ }
+
+ @Override
+ public void run() {
+ serviceA.print("123");
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadB.java
new file mode 100644
index 0000000..0c3d6dc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.synchronize.example11;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class ThreadB extends Thread{
+ ServiceB serviceB;
+
+ public ThreadB(ServiceB serviceB) {
+ super();
+ this.serviceB = serviceB;
+ }
+
+ @Override
+ public void run() {
+ serviceB.print(new Object());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/DealThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/DealThread.java
new file mode 100644
index 0000000..0d4ced7
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/DealThread.java
@@ -0,0 +1,46 @@
+package com.brianway.learning.java.multithread.synchronize.example12;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class DealThread implements Runnable{
+ public String username;
+
+ public Object lock1 = new Object();
+ public Object lock2 = new Object();
+
+ public void setFlag(String username){
+ this.username = username;
+ }
+
+ public void run() {
+ if(username.equals("a")){
+ synchronized (lock1){
+ try {
+ System.out.println("username = " + username);
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ synchronized (lock2){
+ System.out.println("按lock1->lock2代码顺序执行");
+ }
+ }
+ }
+ if(username.equals("b")){
+ synchronized (lock2){
+ try {
+ System.out.println("username = " + username);
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ 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
new file mode 100644
index 0000000..f4c7eac
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example12/Run12_deadLock.java
@@ -0,0 +1,198 @@
+package com.brianway.learning.java.multithread.synchronize.example12;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P107
+ * 死锁测试
+ * jstack命令
+ */
+public class Run12_deadLock {
+ public static void main(String[] args) {
+ try {
+ DealThread t1 = new DealThread();
+ t1.setFlag("a");
+ Thread thread1 =new Thread(t1);
+ thread1.start();
+ Thread.sleep(100);
+ t1.setFlag("b");
+ Thread thread2 =new Thread(t1);
+ thread2.start();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
+
+
+/*
+输出:
+username = a
+username = b
+
+---------------------------
+
+
+G:\mygit\java-learning>jps
+4752
+7524 Jps
+8936 Launcher
+
+(启动Run12_deadLock的main方法)
+
+G:\mygit\java-learning>
+G:\mygit\java-learning>jps
+4752
+8948 AppMain
+6344 Jps
+8732 Launcher
+
+G:\mygit\java-learning>jstack -l 8948
+2016-04-13 15:04:01
+Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode):
+
+"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x00000000022df000 nid=0x18dc waiting on condition [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"Thread-1" #12 prio=5 os_prio=0 tid=0x0000000058773800 nid=0x20f0 waiting for monitor entry [0x0000000059c1f000]
+ java.lang.Thread.State: BLOCKED (on object monitor)
+ at com.brianway.learning.java.multithread.synchronize.example12.DealThread.run(DealThread.java:41)
+ - waiting to lock <0x00000000d61411d0> (a java.lang.Object)
+ - locked <0x00000000d61411e0> (a java.lang.Object)
+ at java.lang.Thread.run(Thread.java:745)
+
+ Locked ownable synchronizers:
+ - None
+
+"Thread-0" #11 prio=5 os_prio=0 tid=0x000000005875a000 nid=0x1de8 waiting for monitor entry [0x00000000599bf000]
+ java.lang.Thread.State: BLOCKED (on object monitor)
+ at com.brianway.learning.java.multithread.synchronize.example12.DealThread.run(DealThread.java:27)
+ - waiting to lock <0x00000000d61411e0> (a java.lang.Object)
+ - locked <0x00000000d61411d0> (a java.lang.Object)
+ at java.lang.Thread.run(Thread.java:745)
+
+ Locked ownable synchronizers:
+ - None
+
+"Monitor Ctrl-Break" #10 daemon prio=5 os_prio=0 tid=0x000000005876e800 nid=0x1f50 runnable [0x000000005969f000]
+ java.lang.Thread.State: RUNNABLE
+ at java.net.DualStackPlainSocketImpl.accept0(Native Method)
+ at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
+ at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)
+ at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)
+ - locked <0x00000000d621bce8> (a java.net.SocksSocketImpl)
+ at java.net.ServerSocket.implAccept(ServerSocket.java:545)
+ at java.net.ServerSocket.accept(ServerSocket.java:513)
+ at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:90)
+ at java.lang.Thread.run(Thread.java:745)
+
+ Locked ownable synchronizers:
+ - None
+
+"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x000000005736f800 nid=0x2194 runnable [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x0000000058698800 nid=0x2330 waiting on condition [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x0000000058697800 nid=0x96c waiting on condition [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x0000000058646800 nid=0x1fac waiting on condition [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000005863a800 nid=0x2268 waiting on condition [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000005735d000 nid=0x1e2c runnable [0x0000000000000000]
+ java.lang.Thread.State: RUNNABLE
+
+ Locked ownable synchronizers:
+ - None
+
+"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000057306800 nid=0x62c in Object.wait() [0x000000005836f000]
+ java.lang.Thread.State: WAITING (on object monitor)
+ at java.lang.Object.wait(Native Method)
+ - waiting on <0x00000000d5f86280> (a java.lang.ref.ReferenceQueue$Lock)
+ at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)
+ - locked <0x00000000d5f86280> (a java.lang.ref.ReferenceQueue$Lock)
+ at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:158)
+ at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
+
+ Locked ownable synchronizers:
+ - None
+
+"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000572fd800 nid=0x2254 in Object.wait() [0x000000005862f000]
+ java.lang.Thread.State: WAITING (on object monitor)
+ at java.lang.Object.wait(Native Method)
+ - waiting on <0x00000000d5f85cf0> (a java.lang.ref.Reference$Lock)
+ at java.lang.Object.wait(Object.java:502)
+ at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
+ - locked <0x00000000d5f85cf0> (a java.lang.ref.Reference$Lock)
+
+ Locked ownable synchronizers:
+ - None
+
+"VM Thread" os_prio=2 tid=0x00000000572f7000 nid=0x1ba8 runnable
+
+"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x000000000214d000 nid=0x2274 runnable
+
+"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000000000214e800 nid=0x1a74 runnable
+
+"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002150000 nid=0xad8 runnable
+
+"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002151800 nid=0x668 runnable
+
+"VM Periodic Task Thread" os_prio=2 tid=0x00000000586b0800 nid=0x2150 waiting on condition
+
+JNI global references: 20
+
+
+Found one Java-level deadlock:
+=============================
+"Thread-1":
+ waiting to lock monitor 0x0000000057304218 (object 0x00000000d61411d0, a java.lang.Object),
+ which is held by "Thread-0"
+"Thread-0":
+ waiting to lock monitor 0x0000000057300228 (object 0x00000000d61411e0, a java.lang.Object),
+ which is held by "Thread-1"
+
+Java stack information for the threads listed above:
+===================================================
+"Thread-1":
+ at com.brianway.learning.java.multithread.synchronize.example12.DealThread.run(DealThread.java:41)
+ - waiting to lock <0x00000000d61411d0> (a java.lang.Object)
+ - locked <0x00000000d61411e0> (a java.lang.Object)
+ at java.lang.Thread.run(Thread.java:745)
+"Thread-0":
+ at com.brianway.learning.java.multithread.synchronize.example12.DealThread.run(DealThread.java:27)
+ - waiting to lock <0x00000000d61411e0> (a java.lang.Object)
+ - locked <0x00000000d61411d0> (a java.lang.Object)
+ at java.lang.Thread.run(Thread.java:745)
+
+Found 1 deadlock.
+
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..05723f3
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.multithread.synchronize.example13;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class OutClass {
+ static class Inner{
+ public void method1() {
+ synchronized ("其他的锁"){
+ for (int i=1;i<=10;i++){
+ System.out.println(Thread.currentThread().getName()+" i="+ i);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ 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) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
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
new file mode 100644
index 0000000..d5fab6b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/OutClass2.java
@@ -0,0 +1,59 @@
+package com.brianway.learning.java.multithread.synchronize.example13;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class OutClass2 {
+ static class InnerClass1{
+ public void method1(InnerClass2 class2){
+ String threadName = Thread.currentThread().getName();
+ synchronized (class2) {
+ System.out.println(threadName + " 进入InnerClass1类中的method1方法");
+ for (int i = 1; i <= 10; i++) {
+ System.out.println("i=" + i);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.println(threadName + " 离开InnerClass1类中的method1方法");
+ }
+ }
+
+ public synchronized void method2(){
+ String threadName = Thread.currentThread().getName();
+
+ System.out.println(threadName + " 进入InnerClass1类中的method2方法");
+ for (int j = 1; j <= 10; j++) {
+ System.out.println("j=" + j);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.println(threadName + " 离开InnerClass1类中的method2方法");
+
+ }
+
+ }
+
+ static class InnerClass2{
+ public synchronized void method1(){
+ String threadName = Thread.currentThread().getName();
+
+ System.out.println(threadName + " 进入InnerClass2类中的method2方法");
+ for (int k = 1; k <= 10; k++) {
+ System.out.println("k=" + k);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ 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
new file mode 100644
index 0000000..54a7583
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner01.java
@@ -0,0 +1,54 @@
+package com.brianway.learning.java.multithread.synchronize.example13;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+
+/**
+ * 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");
+ Thread t2 = new Thread(new Runnable() {
+ public void run() {
+ inner.method2();
+ }
+ },"B");
+ t1.start();
+ t2.start();
+ }
+}
+
+/*
+输出:
+A i=1
+B i=11
+B i=12
+A i=2
+A i=3
+B i=13
+B i=14
+A i=4
+A i=5
+B i=15
+B i=16
+A i=6
+B i=17
+A i=7
+A i=8
+B i=18
+B i=19
+A i=9
+A i=10
+B i=20
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..86a7189
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example13/Run13_inner02.java
@@ -0,0 +1,166 @@
+package com.brianway.learning.java.multithread.synchronize.example13;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P112
+ * 内置类与同步测试2
+ *
+ * T1和T3竞争in2的锁。只有T1结束,T3才能开始;或者T3结束,T1才能开始
+ * T2与另外两个没关系,因为其锁对象是in2
+ */
+
+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();
+ final InnerClass2 in2 = new InnerClass2();
+ Thread t1 = new Thread(new Runnable() {
+ public void run() {
+ in1.method1(in2);
+ }
+ },"T1");
+
+ Thread t2 = new Thread(new Runnable() {
+ public void run() {
+ in1.method2();
+ }
+ },"T2");
+
+ Thread t3 = new Thread(new Runnable() {
+ public void run() {
+ in2.method1();
+ }
+ },"T3");
+
+ t1.start();
+ t2.start();
+ t3.start();
+
+ }
+}
+
+
+/*
+输出:
+T1 进入InnerClass1类中的method1方法
+i=1
+T2 进入InnerClass1类中的method2方法
+j=1
+j=2
+i=2
+j=3
+i=3
+j=4
+i=4
+j=5
+i=5
+j=6
+i=6
+j=7
+i=7
+i=8
+j=8
+i=9
+j=9
+j=10
+i=10
+T2 离开InnerClass1类中的method2方法
+T1 离开InnerClass1类中的method1方法
+T3 进入InnerClass2类中的method2方法
+k=1
+k=2
+k=3
+k=4
+k=5
+k=6
+k=7
+k=8
+k=9
+k=10
+T3 离开InnerClass2类中的method2方法
+
+
+--------------------------
+
+T1 进入InnerClass1类中的method1方法
+i=1
+T2 进入InnerClass1类中的method2方法
+j=1
+j=2
+i=2
+i=3
+j=3
+j=4
+i=4
+i=5
+j=5
+j=6
+i=6
+j=7
+i=7
+i=8
+j=8
+i=9
+j=9
+j=10
+i=10
+T1 离开InnerClass1类中的method1方法
+T3 进入InnerClass2类中的method2方法
+k=1
+T2 离开InnerClass1类中的method2方法
+k=2
+k=3
+k=4
+k=5
+k=6
+k=7
+k=8
+k=9
+k=10
+T3 离开InnerClass2类中的method2方法
+
+-------------------------------
+T3 进入InnerClass2类中的method2方法
+k=1
+T2 进入InnerClass1类中的method2方法
+j=1
+k=2
+j=2
+k=3
+j=3
+j=4
+k=4
+j=5
+k=5
+k=6
+j=6
+k=7
+j=7
+k=8
+j=8
+k=9
+j=9
+k=10
+j=10
+T3 离开InnerClass2类中的method2方法
+T1 进入InnerClass1类中的method1方法
+i=1
+T2 离开InnerClass1类中的method2方法
+i=2
+i=3
+i=4
+i=5
+i=6
+i=7
+i=8
+i=9
+i=10
+T1 离开InnerClass1类中的method1方法
+
+ */
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
new file mode 100644
index 0000000..3a00818
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Run14_setNewStringTwoLock.java
@@ -0,0 +1,53 @@
+package com.brianway.learning.java.multithread.synchronize.example14;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P114
+ * 锁对象改变
+ */
+public class Run14_setNewStringTwoLock {
+ public static void main(String[] args) throws InterruptedException{
+ final Service service = new Service();
+ Thread a = new Thread(){
+ @Override
+ public void run() {
+ service.testMethod();
+ }
+ };
+ a.setName("A");
+ Thread b = new Thread(){
+ @Override
+ public void run() {
+ service.testMethod();
+ }
+ };
+ b.setName("B");
+
+ a.start();
+ Thread.sleep(50);
+ b.start();
+
+ }
+}
+
+
+/*
+输出:
+A begin 1460536381652
+B begin 1460536381702
+A end 1460536383652
+B end 1460536383702
+
+
+--------------
+
+//Thread.sleep(50);
+输出:
+A begin 1460536503287
+A end 1460536505287
+B begin 1460536505287
+B end 1460536507287
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..092b08b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.multithread.synchronize.example14;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class Service {
+ private String lock = "123";
+
+ public void testMethod() {
+ try {
+ 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());
+ }
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
From 31c43f37a70da53e081d4e04db3f639b4f463c00 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 13 Apr 2016 20:13:21 +0800
Subject: [PATCH 06/80] =?UTF-8?q?java-multihread=20=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E8=87=B3=20example16=EF=BC=8Csynchronized=E5=8C=85=E6=9A=82?=
=?UTF-8?q?=E6=97=B6=E7=BB=93=E6=9D=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../example15/Run15_synchronized.java | 38 +++
.../synchronize/example15/Run15_volatile.java | 38 +++
.../synchronize/example15/RunThread.java | 26 ++
.../synchronize/example15/RunThread2.java | 25 ++
.../synchronize/example16/MyThread.java | 20 ++
.../synchronize/example16/Run16_volatile.java | 232 ++++++++++++++++++
6 files changed, 379 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java
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
new file mode 100644
index 0000000..1e5e686
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.synchronize.example15;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P130
+ * sychronized代码块有volatile同步的功能
+ */
+public class Run15_synchronized {
+ public static void main(String[] args) {
+ try {
+ RunThread2 t = new RunThread2();
+ t.start();
+ Thread.sleep(1000);
+ t.setRunning(false);
+ System.out.println("已经赋值为false");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*
+输出:
+进入run了
+线程被停止了
+已经赋值为false
+
+-----------------
+注释掉RunThread2类中的synchronized ("any thing"){}
+输出:
+进入run了
+已经赋值为false
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java
new file mode 100644
index 0000000..10b4c9b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.synchronize.example15;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P121
+ * 不使用volatile关键字
+ * JVM配置 -server(IDEA15.02,jdk1.8,WIN7,64bit不加效果也是的)
+ */
+public class Run15_volatile {
+ public static void main(String[] args) {
+ try {
+ RunThread t = new RunThread();
+ t.start();
+ Thread.sleep(1000);
+ t.setRunning(false);
+ System.out.println("已经赋值为false");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*
+输出:
+进入run了
+已经赋值为false
+
+--------------
+加上volatile关键字后
+输出:
+进入run了
+已经赋值为false
+线程被停止了
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..68dc879
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.synchronize.example15;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class RunThread extends Thread{
+ private boolean isRunning = true;
+ //volatile private boolean isRunning = true;
+
+ public boolean isRunning(){
+ return isRunning;
+ }
+
+ public void setRunning(boolean running) {
+ isRunning = running;
+ }
+
+ @Override
+ public void run() {
+ System.out.println("进入run了");
+ 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
new file mode 100644
index 0000000..dd016ba
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java
@@ -0,0 +1,25 @@
+package com.brianway.learning.java.multithread.synchronize.example15;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class RunThread2 extends Thread{
+ private boolean isRunning = true;
+
+ public boolean isRunning(){
+ return isRunning;
+ }
+
+ public void setRunning(boolean running) {
+ isRunning = running;
+ }
+
+ @Override
+ public void run() {
+ System.out.println("进入run了");
+ 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
new file mode 100644
index 0000000..1e42949
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.synchronize.example16;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class MyThread extends Thread {
+ volatile public static int count;
+ //synchronized
+ private static void addCount(){
+ for(int i=0;i<100;i++) {
+ count++;
+ }
+ System.out.println("count="+count);
+ }
+
+ @Override
+ public void run() {
+ addCount();
+ }
+}
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
new file mode 100644
index 0000000..4e80260
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/Run16_volatile.java
@@ -0,0 +1,232 @@
+package com.brianway.learning.java.multithread.synchronize.example16;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P124
+ * volatile非原子的特性
+ */
+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].start();
+ }
+
+ }
+}
+
+/*
+addCount不加synchronized
+输出:
+count=200
+count=200
+count=300
+count=400
+count=500
+count=600
+count=700
+count=800
+count=900
+count=1000
+count=1100
+count=1200
+count=1300
+count=1400
+count=1500
+count=1600
+count=1700
+count=1800
+count=1900
+count=2000
+count=2100
+count=2200
+count=2300
+count=2400
+count=2500
+count=2600
+count=2700
+count=2800
+count=2900
+count=3000
+count=3100
+count=3200
+count=3300
+count=3400
+count=3500
+count=3600
+count=3700
+count=3800
+count=3900
+count=4000
+count=4100
+count=4200
+count=4300
+count=4400
+count=4500
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9456
+count=9556
+count=9456
+count=9656
+count=9756
+count=9756
+count=9756
+count=9856
+count=9456
+count=9456
+count=9456
+count=9456
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9756
+count=9756
+count=9656
+count=9556
+count=9556
+count=9956
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+count=9856
+
+
+-----------------------------
+addCount()加synchronized
+输出:
+count=100
+count=200
+count=300
+count=400
+count=500
+count=600
+count=700
+count=800
+count=900
+count=1000
+count=1100
+count=1200
+count=1300
+count=1400
+count=1500
+count=1600
+count=1700
+count=1800
+count=1900
+count=2000
+count=2100
+count=2200
+count=2300
+count=2400
+count=2500
+count=2600
+count=2700
+count=2800
+count=2900
+count=3000
+count=3100
+count=3200
+count=3300
+count=3400
+count=3500
+count=3600
+count=3700
+count=3800
+count=3900
+count=4000
+count=4100
+count=4200
+count=4300
+count=4400
+count=4500
+count=4600
+count=4700
+count=4800
+count=4900
+count=5000
+count=5100
+count=5200
+count=5300
+count=5400
+count=5500
+count=5600
+count=5700
+count=5800
+count=5900
+count=6000
+count=6100
+count=6200
+count=6300
+count=6400
+count=6500
+count=6600
+count=6700
+count=6800
+count=6900
+count=7000
+count=7100
+count=7200
+count=7300
+count=7400
+count=7500
+count=7600
+count=7700
+count=7800
+count=7900
+count=8000
+count=8100
+count=8200
+count=8300
+count=8400
+count=8500
+count=8600
+count=8700
+count=8800
+count=8900
+count=9000
+count=9100
+count=9200
+count=9300
+count=9400
+count=9500
+count=9600
+count=9700
+count=9800
+count=9900
+count=10000
+ */
\ No newline at end of file
From 82ac4cf8ec5d57530e519bad125d45ed44d48ab5 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Wed, 13 Apr 2016 22:31:01 +0800
Subject: [PATCH 07/80] =?UTF-8?q?java-multihread=20=E6=B7=BB=E5=8A=A0commu?=
=?UTF-8?q?nication=E5=8C=85,=E6=9B=B4=E6=96=B0=E8=87=B3example2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../communication/example1/MyList.java | 20 +++++
.../example1/Run1_TwoThreadTransData.java | 60 +++++++++++++
.../communication/example1/ThreadA.java | 26 ++++++
.../communication/example1/ThreadB.java | 29 +++++++
.../example2/Run2_noObjectLock.java | 34 ++++++++
.../communication/example2/Run2_notify.java | 36 ++++++++
.../communication/example2/Run2_sleep.java | 84 +++++++++++++++++++
.../communication/example2/Run2_wait.java | 32 +++++++
.../communication/example2/Thread1.java | 26 ++++++
.../communication/example2/Thread2.java | 28 +++++++
10 files changed, 375 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_noObjectLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_notify.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_sleep.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_wait.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Thread2.java
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
new file mode 100644
index 0000000..f78403d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.communication.example1;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class MyList {
+ private List list = new ArrayList();
+
+ public void add(){
+ list.add("brian");
+ }
+ 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
new file mode 100644
index 0000000..cdc5b50
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/Run1_TwoThreadTransData.java
@@ -0,0 +1,60 @@
+package com.brianway.learning.java.multithread.communication.example1;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P134
+ * 不使用等待/通知机制实现线程间通信
+ *
+ * 这里有可见性的问题,并不一定能看到线程b退出。
+ */
+public class Run1_TwoThreadTransData {
+ public static void main(String[] args) {
+ MyList service = new MyList();
+ ThreadA a =new ThreadA(service);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(service);
+ b.setName("B");
+ b.start();
+ }
+
+}
+
+
+/*
+在ThreadB的run方法while里加上synchronized ("any"){}
+
+输出:
+添加了1元素
+添加了2元素
+添加了3元素
+添加了4元素
+java.lang.InterruptedException
+ at com.brianway.learning.java.multithread.communication.example1.ThreadB.run(ThreadB.java:22)
+添加了5元素
+达到size了,线程b要退出了
+添加了6元素
+添加了7元素
+添加了8元素
+添加了9元素
+添加了10元素
+
+
+----------------
+若不加synchronized ("any"){}
+
+输出:
+添加了1元素
+添加了2元素
+添加了3元素
+添加了4元素
+添加了5元素
+添加了6元素
+添加了7元素
+添加了8元素
+添加了9元素
+添加了10元素
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..225099b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.communication.example1;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class ThreadA extends Thread {
+ private MyList list;
+
+ public ThreadA(MyList list) {
+ super();
+ this.list = list;
+ }
+
+ @Override
+ public void run() {
+ for(int i = 0;i<10;i++){
+ list.add();
+ System.out.println("添加了"+(i+1)+"元素");
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
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
new file mode 100644
index 0000000..88b5a10
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java
@@ -0,0 +1,29 @@
+package com.brianway.learning.java.multithread.communication.example1;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+public class ThreadB extends Thread {
+ private MyList list;
+
+ public ThreadB(MyList list) {
+ super();
+ this.list = list;
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (true){
+ //System.out.println("in b while: "+list.size());
+ //synchronized ("any"){}
+ if(list.size() == 5){
+ System.out.println("达到size了,线程b要退出了");
+ throw new InterruptedException();
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_noObjectLock.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_noObjectLock.java
new file mode 100644
index 0000000..8173178
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_noObjectLock.java
@@ -0,0 +1,34 @@
+package com.brianway.learning.java.multithread.communication.example2;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P137
+ * 没有“对象监视器”,调用wait()方法出现运行时异常
+ */
+public class Run2_noObjectLock {
+ public static void main(String[] args) {
+ String s = new String("");
+ try {
+ s.wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+/*
+输出:
+Exception in thread "main" java.lang.IllegalMonitorStateException
+ at java.lang.Object.wait(Native Method)
+ at java.lang.Object.wait(Object.java:502)
+ at com.brianway.learning.java.multithread.communication.example2.Run2_noObjectLock.main(Run2_noObjectLock.java:15)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:483)
+ at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_notify.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_notify.java
new file mode 100644
index 0000000..9320c0a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_notify.java
@@ -0,0 +1,36 @@
+package com.brianway.learning.java.multithread.communication.example2;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P139
+ * notify实现通知
+ * notify调用后,并不会立即释放对象锁,而是退出synchronized代码块后
+ */
+public class Run2_notify {
+ public static void main(String[] args) {
+ try {
+ Object lock = new Object();
+ Thread1 t1 = new Thread1(lock);
+ t1.start();
+ Thread.sleep(3000);
+ Thread2 t2 = new Thread2(lock);
+ t2.start();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
+
+
+/*
+输出:
+开始 wait time=1460554213416
+开始 notify time=1460554216418
+结束 notify time=1460554218418
+结束 wait time=1460554218418
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_sleep.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_sleep.java
new file mode 100644
index 0000000..dc51dcc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_sleep.java
@@ -0,0 +1,84 @@
+package com.brianway.learning.java.multithread.communication.example2;
+
+/**
+ * Created by Brian on 2016/4/13.
+ */
+
+/**
+ * P142
+ * 测试sleep()期间其他线程是否执行
+ * 处理器资源,对象锁,是不同的概念
+ *
+ */
+public class Run2_sleep {
+ public static void main(String[] args) {
+ Thread t1 =new Thread(){
+ @Override
+ public void run() {
+ super.run();
+ System.out.println(Thread.currentThread().getName()+" begin sleep");
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println(Thread.currentThread().getName()+" end sleep");
+ }
+ };
+ t1.setName("t1");
+
+ Thread t2 = new Thread(){
+ @Override
+ public void run() {
+ super.run();
+ long i =0;
+ long max = (long)Integer.MAX_VALUE;
+ System.out.println("max = "+max);
+
+ System.out.println(Thread.currentThread().getName()+" begin while");
+ while(i
Date: Thu, 14 Apr 2016 22:11:16 +0800
Subject: [PATCH 10/80] =?UTF-8?q?java-multithread=20communication=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E8=87=B3example16,=E6=9C=AC=E5=8C=85=E5=91=8A?=
=?UTF-8?q?=E4=B8=80=E6=AE=B5=E8=90=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
blogs/README.md | 10 +-
.../brianway/learning/java/base/Boxing.java | 38 +++
.../java/base/constructor/FatherClass.java | 17 ++
.../java/base/constructor/SonClass.java | 33 +++
.../communication/example12/ReadData.java | 24 ++
.../example12/Run12_pipeInputOutput.java | 66 +++++
.../communication/example12/ThreadRead.java | 22 ++
.../communication/example12/ThreadWrite.java | 22 ++
.../communication/example12/WriteData.java | 25 ++
.../communication/example13/BackupA.java | 18 ++
.../communication/example13/BackupB.java | 18 ++
.../communication/example13/DBTools.java | 38 +++
.../example13/Run13_wait_notify_insert.java | 226 ++++++++++++++++++
.../communication/example14/Run14_join.java | 45 ++++
.../example14/Run14_joinExption.java | 34 +++
.../example14/Run14_joinLong.java | 43 ++++
.../communication/example14/ThreadA.java | 14 ++
.../communication/example14/ThreadB.java | 19 ++
.../communication/example14/ThreadC.java | 19 ++
.../example15/Run15_joinMore.java | 90 +++++++
.../example15/Run15_join_sleep.java | 35 +++
.../example15/Run15_join_sleep_2.java | 61 +++++
.../communication/example15/ThreadA.java | 25 ++
.../communication/example15/ThreadB.java | 23 ++
.../communication/example15/ThreadC.java | 21 ++
.../example16/InheritableThreadLocalExt.java | 13 +
.../example16/InheritableThreadLocalExt2.java | 18 ++
.../Run16_InheritableThreadLocalExt.java | 49 ++++
.../Run16_InheritableThreadLocalExt2.java | 49 ++++
.../example16/Run16_ThreadLocal.java | 49 ++++
.../communication/example16/ThreadA.java | 18 ++
.../communication/example16/ThreadB.java | 18 ++
.../communication/example16/ThreadC.java | 18 ++
.../example16/ThreadLocalExt.java | 13 +
.../communication/example16/Tools.java | 11 +
35 files changed, 1241 insertions(+), 1 deletion(-)
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/Boxing.java
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
create mode 100644 java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ReadData.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/Run12_pipeInputOutput.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadRead.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadWrite.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/WriteData.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/DBTools.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/Run13_wait_notify_insert.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_join.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinLong.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadC.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_joinMore.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_join_sleep.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_join_sleep_2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadC.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/InheritableThreadLocalExt.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/InheritableThreadLocalExt2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/Run16_InheritableThreadLocalExt.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/Run16_InheritableThreadLocalExt2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/Run16_ThreadLocal.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadC.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadLocalExt.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/Tools.java
diff --git a/blogs/README.md b/blogs/README.md
index 7ecb5a1..57d6ca8 100644
--- a/blogs/README.md
+++ b/blogs/README.md
@@ -1,4 +1,12 @@
-# 博客目录
+# 博客
+
+如果你只是单纯要阅读的话,建议移步CSDN或者oschina上观看,访问速度快很多:
+
+>* CSDN:[我的java&javaweb学习笔记(汇总)](http://blog.csdn.net/h3243212/article/details/50659471)
+>* oschina:[我的java&javaweb学习笔记(汇总)](http://my.oschina.net/brianway/blog/614355)
+
+
+# 目录
- [javase](/blogs/javase)
- [java基础巩固笔记(1)-反射.md](/blogs/javase/java基础巩固笔记(1)-反射.md)
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/Boxing.java
new file mode 100644
index 0000000..98e8e8e
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/Boxing.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.base;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * 待理解。
+ * 应该是考装箱和拆箱
+ */
+public class Boxing {
+ public static void main(String[] args) {
+ Integer a = 1;
+ Integer b = 2;
+ Integer c = 3;
+ Integer d = 3;
+ Integer e = 321;
+ Integer f = 321;
+ Long g = 3L;
+ System.out.println(c == d);
+ System.out.println(e == f);
+ System.out.println(c == (a + b));
+ System.out.println(c.equals(a + b));
+ System.out.println(g == (a + b));
+ System.out.println(g.equals(a + b));
+
+ }
+}
+
+/*
+输出:
+true
+false
+true
+true
+true
+false
+ */
\ 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
new file mode 100644
index 0000000..8983d1e
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.base.constructor;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class FatherClass {
+ private String name;
+
+ public FatherClass(){
+ System.out.println("执行了父类的无参构造方法");
+ }
+
+ public FatherClass(String name) {
+ this.name = name;
+ System.out.println("执行了父类的构造方法FatherClass(String 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
new file mode 100644
index 0000000..e923ec9
--- /dev/null
+++ b/java-base/src/main/java/com/brianway/learning/java/base/constructor/SonClass.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.base.constructor;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * 构造方法调用问题
+ * 子类构造方法会首先默认调用父类的无参构造方法,无论是否显式写了super();
+ */
+public class SonClass extends FatherClass{
+ public SonClass(String name) {
+ //super(name);
+ System.out.println("执行了子类的构造方法SonClass(String name)");
+ }
+
+ public SonClass() {
+ System.out.println("执行了子类的无参构造方法");
+ }
+
+ public static void main(String[] args) {
+ new SonClass("aaa");
+ new SonClass();
+ }
+
+}
+
+/*
+执行了父类的无参构造方法
+执行了子类的构造方法SonClass(String name)
+执行了父类的无参构造方法
+执行了子类的无参构造方法
+ */
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ReadData.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ReadData.java
new file mode 100644
index 0000000..887ceae
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ReadData.java
@@ -0,0 +1,24 @@
+package com.brianway.learning.java.multithread.communication.example12;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class ReadData {
+ public void readMethod(PipedInputStream input){
+ try {
+ System.out.println("read :");
+ byte[]bytes = new byte[20];
+ int readLength = input.read(bytes);
+ while (readLength!=-1){
+ String newData = new String(bytes,0,readLength);
+ System.out.print(newData);
+ readLength = input.read(bytes);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/Run12_pipeInputOutput.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/Run12_pipeInputOutput.java
new file mode 100644
index 0000000..d60bf11
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/Run12_pipeInputOutput.java
@@ -0,0 +1,66 @@
+package com.brianway.learning.java.multithread.communication.example12;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * P173
+ * 通过管道进行线程间通信:字节流
+ *
+ * 字符流PipedWriter,PipedReader,同理。
+ */
+public class Run12_pipeInputOutput {
+ public static void main(String[] args) {
+ try {
+ WriteData writeData = new WriteData();
+ ReadData readData = new ReadData();
+
+ PipedInputStream inputStream = new PipedInputStream();
+ PipedOutputStream outputStream = new PipedOutputStream();
+
+ //inputStream.connect(outputStream);
+ outputStream.connect(inputStream);
+
+ ThreadRead threadRead = new ThreadRead(readData,inputStream);
+ threadRead.start();
+
+ Thread.sleep(2000);
+
+ ThreadWrite threadWrite = new ThreadWrite(writeData,outputStream);
+ threadWrite.start();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }catch (InterruptedException e){
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*
+输出:
+read :
+write :
+123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
+123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
+
+--------------
+取消注释//inputStream.connect(outputStream);
+输出:
+java.io.IOException: Already connected
+ at java.io.PipedOutputStream.connect(PipedOutputStream.java:100)
+ at com.brianway.learning.java.multithread.communication.example12.Run12_pipeInputOutput.main(Run12_pipeInputOutput.java:25)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:483)
+ at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadRead.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadRead.java
new file mode 100644
index 0000000..47d28de
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadRead.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.multithread.communication.example12;
+
+import java.io.PipedInputStream;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class ThreadRead extends Thread {
+ private ReadData read;
+ private PipedInputStream input;
+
+ public ThreadRead(ReadData read,PipedInputStream input) {
+ super();
+ this.input = input;
+ this.read = read;
+ }
+
+ @Override
+ public void run() {
+ read.readMethod(input);
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadWrite.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadWrite.java
new file mode 100644
index 0000000..2e68847
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadWrite.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.multithread.communication.example12;
+
+import java.io.PipedOutputStream;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class ThreadWrite extends Thread{
+ private WriteData write;
+ private PipedOutputStream out;
+
+ public ThreadWrite(WriteData write, PipedOutputStream out) {
+ super();
+ this.write = write;
+ this.out = out;
+ }
+
+ @Override
+ public void run() {
+ write.writeMethod(out);
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/WriteData.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/WriteData.java
new file mode 100644
index 0000000..0e24a61
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/WriteData.java
@@ -0,0 +1,25 @@
+package com.brianway.learning.java.multithread.communication.example12;
+
+import java.io.IOException;
+import java.io.PipedOutputStream;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class WriteData {
+ public void writeMethod(PipedOutputStream out){
+ try {
+ System.out.println("write :");
+ for(int i=0;i<300;i++){
+ String outData = "" + (i+1);
+ out.write(outData.getBytes());
+ System.out.print(outData);
+ }
+ System.out.println();
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupA.java
new file mode 100644
index 0000000..15bc3da
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupA.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.communication.example13;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class BackupA extends Thread {
+ private DBTools dbTools;
+
+ public BackupA(DBTools dbTools) {
+ super();
+ this.dbTools = dbTools;
+ }
+
+ @Override
+ public void run() {
+ dbTools.backupA();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupB.java
new file mode 100644
index 0000000..387aa94
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupB.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.communication.example13;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class BackupB extends Thread {
+ private DBTools dbTools;
+
+ public BackupB(DBTools dbTools) {
+ super();
+ this.dbTools = dbTools;
+ }
+
+ @Override
+ public void run() {
+ dbTools.backupB();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/DBTools.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/DBTools.java
new file mode 100644
index 0000000..142f8fa
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/DBTools.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.communication.example13;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class DBTools {
+ volatile private boolean prevIsA = false;
+
+ synchronized public void backupA(){
+ try {
+ while (prevIsA == true){
+ wait();
+ }
+ for(int i =0;i<5;i++){
+ System.out.println("★★★★★");
+ }
+ prevIsA = true;
+ notifyAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ synchronized public void backupB(){
+ try {
+ while (prevIsA == false){
+ wait();
+ }
+ for(int i =0;i<5;i++){
+ System.out.println("☆☆☆☆☆");
+ }
+ prevIsA = false;
+ notifyAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/Run13_wait_notify_insert.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/Run13_wait_notify_insert.java
new file mode 100644
index 0000000..45b536b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/Run13_wait_notify_insert.java
@@ -0,0 +1,226 @@
+package com.brianway.learning.java.multithread.communication.example13;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * P177
+ *
+ * 等待/通知,交叉执行
+ */
+public class Run13_wait_notify_insert {
+ public static void main(String[] args) {
+ DBTools dbTools =new DBTools();
+ for (int i = 0;i<20;i++){
+ BackupB output = new BackupB(dbTools);
+ output.start();
+ BackupA input = new BackupA(dbTools);
+ input.start();
+ }
+ }
+}
+
+/*
+输出:
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+★★★★★
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+☆☆☆☆☆
+ */
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_join.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_join.java
new file mode 100644
index 0000000..bda8a2d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_join.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.multithread.communication.example14;
+
+
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * P180
+ * join示例,阻塞当前线程z,使join所属的线程对象x正常执行run()方法,执行完在继续当前线程z后面的代码
+ */
+public class Run14_join {
+ public static void main(String[] args) {
+ try {
+ Run14_Thread t = new Run14_Thread();
+ t.start();
+ t.join();
+ System.out.println("thread执行完后在会打印这句话");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ static class Run14_Thread extends Thread{
+ @Override
+ public void run() {
+ try {
+ int secondValue = (int) (Math.random()*10000);
+ System.out.println(secondValue);
+ Thread.sleep(secondValue);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
+
+
+/*
+输出:
+6690
+thread执行完后在会打印这句话
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java
new file mode 100644
index 0000000..773dfaf
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java
@@ -0,0 +1,34 @@
+package com.brianway.learning.java.multithread.communication.example14;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * P181
+ * join的异常
+ * 线程b被中断了,但a还在正常运行
+ */
+public class Run14_joinExption {
+ public static void main(String[] args) {
+ try {
+ ThreadB b = new ThreadB();
+ b.start();
+ Thread.sleep(500);
+ ThreadC c =new ThreadC(b);
+ c.start();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+/*
+输出:
+线程B在catch处打印了
+java.lang.InterruptedException
+ at java.lang.Object.wait(Native Method)
+ at java.lang.Thread.join(Thread.java:1245)
+ at java.lang.Thread.join(Thread.java:1319)
+ at com.brianway.learning.java.multithread.communication.example14.ThreadB.run(ThreadB.java:12)
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinLong.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinLong.java
new file mode 100644
index 0000000..5a7c763
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinLong.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.multithread.communication.example14;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+
+/**
+ * P183
+ * join(long)设定等待的时间
+ * join(long)和sleep(long)运行效果并无区别,但对同步的处理不同。
+ */
+public class Run14_joinLong {
+ public static void main(String[] args) {
+ try {
+ Run14_Thread thread = new Run14_Thread();
+ thread.start();
+ thread.join(2000);//只等2秒
+ //Thread.sleep(2000);
+ System.out.println("end timer="+System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ static class Run14_Thread extends Thread{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+System.currentTimeMillis());
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
+
+
+/*
+输出:
+begin timer=1460635411651
+end timer=1460635413651
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadA.java
new file mode 100644
index 0000000..900c3d0
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadA.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.communication.example14;
+
+/**
+ * Created by Brian on 2016/4/14.
+ */
+public class ThreadA extends Thread{
+ @Override
+ public void run() {
+ for(int i = 0;i
Date: Fri, 15 Apr 2016 00:39:58 +0800
Subject: [PATCH 11/80] =?UTF-8?q?java-multithread=20lock=E5=8C=85=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E8=87=B3example1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../example1/Run1_UseConditionWaitNotify.java | 25 +++++++++++++
.../Run1_UseConditionWaitNotifyError.java | 32 +++++++++++++++++
.../Run1_UseConditionWaitNotifyOk.java | 32 +++++++++++++++++
.../multithread/lock/example1/ServiceA.java | 21 +++++++++++
.../multithread/lock/example1/ServiceB.java | 27 ++++++++++++++
.../multithread/lock/example1/ServiceC.java | 36 +++++++++++++++++++
.../multithread/lock/example1/ThreadA.java | 17 +++++++++
.../multithread/lock/example1/ThreadB.java | 17 +++++++++
.../multithread/lock/example1/ThreadC.java | 17 +++++++++
9 files changed, 224 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyError.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceC.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadC.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java
new file mode 100644
index 0000000..83ebec5
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java
@@ -0,0 +1,25 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+/**
+ * P206
+ * 使用Condition实现等待通知
+ * Condition对象的await()方法,线程WAITING
+ */
+public class Run1_UseConditionWaitNotify {
+ public static void main(String[] args) {
+ ServiceB service = new ServiceB();
+ ThreadB b = new ThreadB(service);
+ b.start();
+ }
+}
+
+
+/*
+输出:
+A
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyError.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyError.java
new file mode 100644
index 0000000..6cfd87e
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyError.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+/**
+ * P204
+ * 使用Condition实现等待通知,展示错误用法
+ * IllegalMonitorStateException,监视器出错
+ */
+public class Run1_UseConditionWaitNotifyError {
+ public static void main(String[] args) {
+ ServiceA service = new ServiceA();
+ ThreadA a = new ThreadA(service);
+ a.start();
+ }
+}
+
+
+/*
+输出:
+Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
+ at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
+ at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
+ at java.util.concurrent.locks.AbstractQueuedSynchronizer.fullyRelease(AbstractQueuedSynchronizer.java:1723)
+ at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2036)
+ at com.brianway.learning.java.multithread.lock.example1.ServiceA.await(ServiceA.java:16)
+ at com.brianway.learning.java.multithread.lock.example1.ThreadA.run(ThreadA.java:15)
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java
new file mode 100644
index 0000000..1e4cd42
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+/**
+ * P207
+ * 正确使用Condition实现等待通知
+ * Object类的wait()------Condition类的await()
+ * Object类的wait(long timeout)------Condition类的await(long time,TimeUnit unit)
+ * Object类的notify()------Condition类的signal()
+ * Object类的notifyAll()------Condition类的signalAll()
+ */
+public class Run1_UseConditionWaitNotifyOk {
+ public static void main(String[] args) throws InterruptedException {
+ ServiceC service = new ServiceC();
+ ThreadC c = new ThreadC(service);
+ c.start();
+ Thread.sleep(3000);
+ service.signal();
+ }
+}
+
+
+/*
+输出:
+await 时间为1460651340418
+signal时间为1460651343418
+锁释放了
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceA.java
new file mode 100644
index 0000000..5c42237
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceA.java
@@ -0,0 +1,21 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class ServiceA {
+ private Lock lock = new ReentrantLock();
+ private Condition condition = lock.newCondition();
+
+ public void await(){
+ try {
+ condition.await();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceB.java
new file mode 100644
index 0000000..f641eea
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceB.java
@@ -0,0 +1,27 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class ServiceB {
+ private Lock lock = new ReentrantLock();
+ private Condition condition = lock.newCondition();
+
+ public void waitMethod(){
+ try {
+ lock.lock();
+ System.out.println("A");
+ condition.await();
+ System.out.println("B");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }finally {
+ lock.unlock();
+ System.out.println("锁释放了");
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceC.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceC.java
new file mode 100644
index 0000000..c7928c4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceC.java
@@ -0,0 +1,36 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class ServiceC {
+ private Lock lock = new ReentrantLock();
+ private Condition condition = lock.newCondition();
+
+ public void await(){
+ try {
+ lock.lock();
+ System.out.println("await 时间为"+System.currentTimeMillis());
+ condition.await();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }finally {
+ lock.unlock();
+ System.out.println("锁释放了");
+ }
+ }
+
+ public void signal(){
+ try {
+ lock.lock();
+ System.out.println("signal时间为"+System.currentTimeMillis());
+ condition.signal();
+ } finally {
+ lock.unlock();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadA.java
new file mode 100644
index 0000000..40f3b77
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadA.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class ThreadA extends Thread {
+ private ServiceA service;
+
+ public ThreadA(ServiceA service) {
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.await();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadB.java
new file mode 100644
index 0000000..59291ad
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadB.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class ThreadB extends Thread {
+ private ServiceB service;
+
+ public ThreadB(ServiceB service) {
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.waitMethod();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadC.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadC.java
new file mode 100644
index 0000000..b79b80f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadC.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.lock.example1;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class ThreadC extends Thread {
+ private ServiceC service;
+
+ public ThreadC(ServiceC service) {
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.await();
+ }
+}
From cebf798949d25103defdbcf9ad22c7bc208059e6 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Fri, 15 Apr 2016 20:45:10 +0800
Subject: [PATCH 12/80] =?UTF-8?q?java-multithread=20lock=E5=8C=85=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E8=87=B3example9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../multithread/lock/example2/MyService.java | 63 ++++++++++++++
.../example2/Run2_MustUseMoreCondition.java | 33 +++++++
.../multithread/lock/example2/ThreadA.java | 17 ++++
.../multithread/lock/example2/ThreadB.java | 17 ++++
.../multithread/lock/example3/MyService.java | 54 ++++++++++++
.../example3/Run3_ConditionManyToMany.java | 81 +++++++++++++++++
.../multithread/lock/example3/ThreadA.java | 21 +++++
.../multithread/lock/example3/ThreadB.java | 21 +++++
.../multithread/lock/example4/Run4_Fair.java | 86 +++++++++++++++++++
.../lock/example4/Run4_notFair.java | 82 ++++++++++++++++++
.../multithread/lock/example4/Service.java | 24 ++++++
.../lock/example5/Run5_getHoldCount.java | 26 ++++++
.../lock/example5/Run5_getQueueLength.java | 43 ++++++++++
.../example5/Run5_getWaitQueueLength.java | 53 ++++++++++++
.../multithread/lock/example5/Service1.java | 31 +++++++
.../multithread/lock/example5/Service2.java | 22 +++++
.../multithread/lock/example5/Service3.java | 35 ++++++++
.../lock/example6/Run6_hasQueueThread.java | 43 ++++++++++
.../lock/example6/Run6_hasWaiters.java | 41 +++++++++
.../multithread/lock/example6/Service1.java | 23 +++++
.../multithread/lock/example6/Service2.java | 34 ++++++++
.../lock/example7/Run7_isFair.java | 38 ++++++++
.../example7/Run7_isHeldByCurrentThread.java | 30 +++++++
.../lock/example7/Run7_isLocked.java | 31 +++++++
.../multithread/lock/example7/Service1.java | 23 +++++
.../multithread/lock/example7/Service2.java | 24 ++++++
.../multithread/lock/example7/Service3.java | 24 ++++++
.../example8/Run8_lockInterruptibly1.java | 41 +++++++++
.../example8/Run8_lockInterruptibly2.java | 59 +++++++++++++
.../lock/example8/Run8_tryLock.java | 40 +++++++++
.../lock/example8/Run8_tryLock_param.java | 44 ++++++++++
.../multithread/lock/example8/Service1.java | 29 +++++++
.../multithread/lock/example8/Service2.java | 30 +++++++
.../multithread/lock/example8/Service3.java | 17 ++++
.../multithread/lock/example8/Service4.java | 27 ++++++
.../example9/Run9_awaitUniterruptibly1.java | 47 ++++++++++
.../example9/Run9_awaitUniterruptibly2.java | 31 +++++++
.../lock/example9/Run9_awaitUntil1.java | 25 ++++++
.../lock/example9/Run9_awaitUntil2.java | 30 +++++++
.../multithread/lock/example9/Service.java | 41 +++++++++
.../multithread/lock/example9/Service1.java | 26 ++++++
.../multithread/lock/example9/Service2.java | 23 +++++
.../multithread/lock/example9/Thread1.java | 17 ++++
.../multithread/lock/example9/Thread2.java | 17 ++++
.../multithread/lock/example9/ThreadA.java | 17 ++++
.../multithread/lock/example9/ThreadB.java | 17 ++++
46 files changed, 1598 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/MyService.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/MyService.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/Run3_ConditionManyToMany.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_Fair.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Run4_notFair.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Service.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getQueueLength.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getWaitQueueLength.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasQueueThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Run6_hasWaiters.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Service1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Service2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isFair.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isHeldByCurrentThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isLocked.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_lockInterruptibly1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_lockInterruptibly2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock_param.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUniterruptibly1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUniterruptibly2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Thread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/ThreadB.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/MyService.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/MyService.java
new file mode 100644
index 0000000..f6aaff1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/MyService.java
@@ -0,0 +1,63 @@
+package com.brianway.learning.java.multithread.lock.example2;
+
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class MyService {
+ private Lock lock = new ReentrantLock();
+ private Condition conditionA = lock.newCondition();
+ private Condition conditionB = lock.newCondition();
+
+ public void awaitA(){
+ try {
+ lock.lock();
+ System.out.println("awaitA begin时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ conditionA.await();
+ System.out.println("awaitA end 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }finally {
+ lock.unlock();
+ System.out.println("A锁释放了 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ }
+ }
+
+ public void awaitB(){
+ try {
+ lock.lock();
+ System.out.println("awaitB begin时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ conditionB.await();
+ System.out.println("awaitB end 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }finally {
+ lock.unlock();
+ System.out.println("B锁释放了 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ }
+ }
+
+ public void signalAll_A(){
+ try {
+ lock.lock();
+ System.out.println("signalAll_A 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ conditionA.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public void signalAll_B(){
+ try {
+ lock.lock();
+ System.out.println("signalAll_B 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ conditionB.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java
new file mode 100644
index 0000000..1f1f6ec
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.lock.example2;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P210
+ * 使用多个condition实现通知部分线程
+ */
+public class Run2_MustUseMoreCondition {
+ public static void main(String[] args) throws InterruptedException {
+ MyService service = new MyService();
+ ThreadA a = new ThreadA(service);
+ a.setName("A");
+ a.start();
+ ThreadB b = new ThreadB(service);
+ b.setName("B");
+ b.start();
+ Thread.sleep(3000);
+ service.signalAll_A();
+ }
+}
+
+
+/*
+输出:
+awaitA begin时间为1460687242048 ThreadName=A
+awaitB begin时间为1460687242048 ThreadName=B
+signalAll_A 时间为1460687245048 ThreadName=main
+awaitA end 时间为1460687245048 ThreadName=A
+A锁释放了 时间为1460687245048 ThreadName=A
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadA.java
new file mode 100644
index 0000000..713d162
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadA.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.lock.example2;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class ThreadA extends Thread{
+ private MyService service;
+
+ public ThreadA(MyService service) {
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.awaitA();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadB.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadB.java
new file mode 100644
index 0000000..66aa790
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadB.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.lock.example2;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class ThreadB extends Thread{
+ private MyService service;
+
+ public ThreadB(MyService service) {
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ service.awaitB();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/MyService.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/MyService.java
new file mode 100644
index 0000000..135e787
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/MyService.java
@@ -0,0 +1,54 @@
+package com.brianway.learning.java.multithread.lock.example3;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class MyService {
+ private ReentrantLock lock = new ReentrantLock();
+ private Condition condition = lock.newCondition();
+ private boolean hasValue = false;
+
+
+ public void set(){
+ try {
+ lock.lock();
+ while (hasValue == true){
+ System.out.println("有可能★★连续"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ condition.await();
+ }
+ System.out.println("打印★"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ hasValue = true;
+ //condition.signal();
+ condition.signalAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ System.out.println("set unlock"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ lock.unlock();
+ }
+ }
+
+
+ public void get(){
+ try {
+ lock.lock();
+ while (hasValue == false){
+ System.out.println("有可能☆☆连续"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ condition.await();
+ }
+ System.out.println("打印☆"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ hasValue = false;
+ //condition.signal();
+ condition.signalAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ System.out.println("get unlock"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
+ lock.unlock();
+ }
+ }
+
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/Run3_ConditionManyToMany.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/Run3_ConditionManyToMany.java
new file mode 100644
index 0000000..7f7d274
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/Run3_ConditionManyToMany.java
@@ -0,0 +1,81 @@
+package com.brianway.learning.java.multithread.lock.example3;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P215
+ * 实现生产者/消费者模式,多对多交替打印
+ * signal()会假死
+ * signalAll()
+ */
+public class Run3_ConditionManyToMany {
+ public static void main(String[] args) {
+ MyService service = new MyService();
+ ThreadA[] threadAs = new ThreadA[10];
+ ThreadB[] threadBs = new ThreadB[10];
+ for(int i=0;i<10;i++){
+ threadAs[i] = new ThreadA(service);
+ threadBs[i] = new ThreadB(service);
+ threadAs[i].start();
+ threadBs[i].start();
+ }
+ }
+}
+
+
+/*
+输出:
+有可能★★连续 时间为1460688833773 ThreadName=Thread-18
+有可能★★连续 时间为1460688833773 ThreadName=Thread-2
+有可能★★连续 时间为1460688833773 ThreadName=Thread-10
+有可能★★连续 时间为1460688833773 ThreadName=Thread-4
+有可能★★连续 时间为1460688833773 ThreadName=Thread-8
+有可能★★连续 时间为1460688833773 ThreadName=Thread-0
+打印☆ 时间为1460688833773 ThreadName=Thread-13
+get unlock 时间为1460688833773 ThreadName=Thread-13
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-13
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-7
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-9
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-11
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-1
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-5
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-15
+打印★ 时间为1460688833773 ThreadName=Thread-6
+set unlock 时间为1460688833773 ThreadName=Thread-6
+有可能★★连续 时间为1460688833773 ThreadName=Thread-6
+有可能★★连续 时间为1460688833773 ThreadName=Thread-12
+有可能★★连续 时间为1460688833773 ThreadName=Thread-16
+有可能★★连续 时间为1460688833773 ThreadName=Thread-14
+打印☆ 时间为1460688833773 ThreadName=Thread-17
+get unlock 时间为1460688833773 ThreadName=Thread-17
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-17
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-3
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-19
+打印★ 时间为1460688833773 ThreadName=Thread-18
+set unlock 时间为1460688833773 ThreadName=Thread-18
+有可能★★连续 时间为1460688833773 ThreadName=Thread-18
+有可能★★连续 时间为1460688833773 ThreadName=Thread-2
+有可能★★连续 时间为1460688833773 ThreadName=Thread-10
+有可能★★连续 时间为1460688833773 ThreadName=Thread-4
+有可能★★连续 时间为1460688833773 ThreadName=Thread-8
+有可能★★连续 时间为1460688833773 ThreadName=Thread-0
+打印☆ 时间为1460688833773 ThreadName=Thread-13
+get unlock 时间为1460688833773 ThreadName=Thread-13
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-13
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-7
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-9
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-11
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-1
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-5
+有可能☆☆连续 时间为1460688833773 ThreadName=Thread-15
+打印★ 时间为1460688833773 ThreadName=Thread-6
+set unlock 时间为1460688833773 ThreadName=Thread-6
+有可能★★连续 时间为1460688833773 ThreadName=Thread-6
+有可能★★连续 时间为1460688833773 ThreadName=Thread-12
+有可能★★连续 时间为1460688833773 ThreadName=Thread-16
+有可能★★连续 时间为1460688833773 ThreadName=Thread-14
+打印☆ 时间为1460688833773 ThreadName=Thread-17
+get unlock 时间为1460688833773 ThreadName=Thread-17
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadA.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadA.java
new file mode 100644
index 0000000..4f7416a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadA.java
@@ -0,0 +1,21 @@
+package com.brianway.learning.java.multithread.lock.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class ThreadA extends Thread{
+ private MyService service;
+
+ public ThreadA(MyService service) {
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ for(int i = 0;i
Date: Fri, 15 Apr 2016 21:38:02 +0800
Subject: [PATCH 13/80] =?UTF-8?q?java-multithread=20lock=E5=8C=85=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E8=87=B3example10,lock=E5=8C=85=E5=91=8A=E4=B8=80?=
=?UTF-8?q?=E6=AE=B5=E8=90=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../brianway/learning/java/base/Boxing.java | 1 +
.../example10/Run10_ReadWriteLockBegin1.java | 38 +++++
.../example10/Run10_ReadWriteLockBegin2.java | 38 +++++
.../example10/Run10_ReadWriteLockBegin3.java | 38 +++++
.../lock/example10/Run10_condition.java | 152 ++++++++++++++++++
.../multithread/lock/example10/Service1.java | 30 ++++
.../multithread/lock/example10/Service2.java | 30 ++++
.../multithread/lock/example10/Service3.java | 44 +++++
8 files changed, 371 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_condition.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service3.java
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/Boxing.java
index 98e8e8e..8ec2160 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/Boxing.java
@@ -5,6 +5,7 @@
*/
/**
+ * TODO
* 待理解。
* 应该是考装箱和拆箱
*/
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java
new file mode 100644
index 0000000..5b075f9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P236
+ * 类ReentrantReadWriteLock的使用:读读共享
+ */
+public class Run10_ReadWriteLockBegin1 {
+ public static void main(String[] args) {
+ final Service1 service = new Service1();
+ Thread a = new Thread(){
+ @Override
+ public void run() {
+ service.read();
+ }
+ };
+ Thread b = new Thread(){
+ @Override
+ public void run() {
+ service.read();
+ }
+ };
+ a.setName("A");
+ a.start();
+ b.setName("B");
+ b.start();
+ }
+}
+
+
+/*
+输出:
+获得读锁A 1460726504907
+获得读锁B 1460726504908
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java
new file mode 100644
index 0000000..a052c01
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P238
+ * 类ReentrantReadWriteLock的使用:写写互斥
+ */
+public class Run10_ReadWriteLockBegin2 {
+ public static void main(String[] args) {
+ final Service2 service = new Service2();
+ Thread a = new Thread(){
+ @Override
+ public void run() {
+ service.write();
+ }
+ };
+ Thread b = new Thread(){
+ @Override
+ public void run() {
+ service.write();
+ }
+ };
+ a.setName("A");
+ a.start();
+ b.setName("B");
+ b.start();
+ }
+}
+
+
+/*
+输出:
+获得写锁A 1460727106721
+获得写锁B 1460727116721
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java
new file mode 100644
index 0000000..6c8cd42
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P238
+ * 类ReentrantReadWriteLock的使用:读写互斥
+ */
+public class Run10_ReadWriteLockBegin3 {
+ public static void main(String[] args) {
+ final Service3 service = new Service3();
+ Thread a = new Thread(){
+ @Override
+ public void run() {
+ service.read();
+ }
+ };
+ Thread b = new Thread(){
+ @Override
+ public void run() {
+ service.write();
+ }
+ };
+ a.setName("A");
+ a.start();
+ b.setName("B");
+ b.start();
+ }
+}
+
+
+/*
+输出:
+获得读锁 A 1460727280066
+获得写锁 B 1460727290067
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_condition.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_condition.java
new file mode 100644
index 0000000..d210230
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_condition.java
@@ -0,0 +1,152 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * P234
+ * Condition实现顺序打印
+ * 这里nextPrintWho的volatile关键词去掉也没什么影响
+ */
+public class Run10_condition {
+ volatile private static int nextPrintWho =1;
+ private static ReentrantLock lock = new ReentrantLock();
+ final private static Condition conditionA = lock.newCondition();
+ final private static Condition conditionB = lock.newCondition();
+ final private static Condition conditionC = lock.newCondition();
+ public static void main(String[] args) {
+ Thread a = new Thread(){
+ @Override
+ public void run() {
+ try {
+ lock.lock();
+ while (nextPrintWho != 1){
+ conditionA.await();
+ }
+
+ for(int i=0;i<3;i++){
+ System.out.println("ThreadA "+(i+1));
+ }
+ nextPrintWho =2;
+ conditionB.signalAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ lock.unlock();
+ }
+ }
+ };
+
+ Thread b = new Thread(){
+ @Override
+ public void run() {
+ try {
+ lock.lock();
+ while (nextPrintWho != 2){
+ conditionB.await();
+ }
+ for(int i=0;i<3;i++){
+ System.out.println("ThreadB "+(i+1));
+ }
+ nextPrintWho =3;
+ conditionC.signalAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ lock.unlock();
+ }
+ }
+ };
+
+ Thread c = new Thread(){
+ @Override
+ public void run() {
+ try {
+ lock.lock();
+ while (nextPrintWho != 3){
+ conditionC.await();
+ }
+ for(int i=0;i<3;i++){
+ System.out.println("ThreadC "+(i+1));
+ }
+ nextPrintWho = 1 ;
+ conditionA.signalAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ lock.unlock();
+ }
+ }
+ };
+
+ Thread[] aArray = new Thread[5];
+ Thread[] bArray = new Thread[5];
+ Thread[] cArray = new Thread[5];
+
+ for (int i = 0;i<5;i++){
+ aArray[i] =new Thread(a);
+ bArray[i] =new Thread(b);
+ cArray[i] =new Thread(c);
+
+ aArray[i].start();
+ bArray[i].start();
+ cArray[i].start();
+ }
+
+
+ }
+}
+
+/*
+输出:
+ThreadA 1
+ThreadA 2
+ThreadA 3
+ThreadB 1
+ThreadB 2
+ThreadB 3
+ThreadC 1
+ThreadC 2
+ThreadC 3
+ThreadA 1
+ThreadA 2
+ThreadA 3
+ThreadB 1
+ThreadB 2
+ThreadB 3
+ThreadC 1
+ThreadC 2
+ThreadC 3
+ThreadA 1
+ThreadA 2
+ThreadA 3
+ThreadB 1
+ThreadB 2
+ThreadB 3
+ThreadC 1
+ThreadC 2
+ThreadC 3
+ThreadA 1
+ThreadA 2
+ThreadA 3
+ThreadB 1
+ThreadB 2
+ThreadB 3
+ThreadC 1
+ThreadC 2
+ThreadC 3
+ThreadA 1
+ThreadA 2
+ThreadA 3
+ThreadB 1
+ThreadB 2
+ThreadB 3
+ThreadC 1
+ThreadC 2
+ThreadC 3
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service1.java
new file mode 100644
index 0000000..28f8eee
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service1.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * TODO
+ * 这里为什么用双try?
+ * 以前不都是直接try catch finally的吗?
+ */
+public class Service1 {
+ private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+ public void read(){
+ try {
+ try {
+ lock.readLock().lock();
+ System.out.println("获得读锁"+ Thread.currentThread().getName()+" "+System.currentTimeMillis());
+ Thread.sleep(10000);
+ } finally {
+ lock.readLock().unlock();
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service2.java
new file mode 100644
index 0000000..c392ff3
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service2.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * TODO
+ * 这里为什么用双try?
+ * 以前不都是直接try catch finally的吗?
+ */
+public class Service2 {
+ private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+ public void write(){
+ try {
+ try {
+ lock.writeLock().lock();
+ System.out.println("获得写锁"+ Thread.currentThread().getName()+" "+System.currentTimeMillis());
+ Thread.sleep(10000);
+ } finally {
+ lock.writeLock().unlock();
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service3.java
new file mode 100644
index 0000000..567bc07
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service3.java
@@ -0,0 +1,44 @@
+package com.brianway.learning.java.multithread.lock.example10;
+
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * TODO
+ * 这里为什么用双try?
+ * 以前不都是直接try catch finally的吗?
+ */
+public class Service3 {
+ private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+ public void read(){
+ try {
+ try {
+ lock.readLock().lock();
+ System.out.println("获得读锁 "+ Thread.currentThread().getName()+" "+System.currentTimeMillis());
+ Thread.sleep(10000);
+ } finally {
+ lock.readLock().unlock();
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void write(){
+ try {
+ try {
+ lock.writeLock().lock();
+ System.out.println("获得写锁 "+ Thread.currentThread().getName()+" "+System.currentTimeMillis());
+ Thread.sleep(10000);
+ } finally {
+ lock.writeLock().unlock();
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
From a4e02b366c06d49a53e3ee8ca81880477f4a8532 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Fri, 15 Apr 2016 22:46:30 +0800
Subject: [PATCH 14/80] =?UTF-8?q?java-multithread=20timer=E5=8C=85?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3example2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../multithread/timer/example1/MyTask.java | 14 ++++++
.../timer/example1/Run1_timer1.java | 33 ++++++++++++++
.../timer/example1/Run1_timer2.java | 33 ++++++++++++++
.../timer/example1/Run1_timer3.java | 33 ++++++++++++++
.../timer/example1/Run1_timer4.java | 43 ++++++++++++++++++
.../timer/example1/Run1_timer5.java | 45 +++++++++++++++++++
.../multithread/timer/example1/TaskA.java | 20 +++++++++
.../multithread/timer/example1/TaskB.java | 15 +++++++
.../multithread/timer/example2/MyTask.java | 14 ++++++
.../timer/example2/Run2_period1.java | 41 +++++++++++++++++
.../timer/example2/Run2_period2.java | 39 ++++++++++++++++
.../timer/example2/Run2_period3.java | 42 +++++++++++++++++
.../multithread/timer/example2/TaskA.java | 20 +++++++++
13 files changed, 392 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java
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
new file mode 100644
index 0000000..ecb1791
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..401fa4a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P242
+ * schedule(TimerTask task, Date time)测试,在未来执行的效果
+ * Timer的构造方法会新启一个线程,且非守护线程
+ */
+public class Run1_timer1 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.SECOND,5);
+ Date runDate = calendar.getTime();
+
+ MyTask task = new MyTask();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:10:14 CST 2016
+任务执行了,时间为:Fri Apr 15 22:10:19 CST 2016
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..16e1e5a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P243
+ * schedule(TimerTask task, Date time)测试,在未来执行的效果
+ * Timer的构造方法会新启一个守护线程
+ * 迅速结束,task任务未被执行
+ */
+public class Run1_timer2 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.SECOND,5);
+ Date runDate = calendar.getTime();
+
+ MyTask task = new MyTask();
+ Timer timer = new Timer(true);//守护线程
+ timer.schedule(task,runDate);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:12:28 CST 2016
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..0ff33f2
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P244
+ * schedule(TimerTask task, Date time)测试,提前运行的效果
+ */
+public class Run1_timer3 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-10);
+ Date runDate = calendar.getTime();
+ System.out.println("计划时间为:"+ runDate);
+ MyTask task = new MyTask();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:15:40 CST 2016
+计划时间为:Fri Apr 15 22:15:30 CST 2016
+任务执行了,时间为:Fri Apr 15 22:15:40 CST 2016
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..ae23c25
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer4.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P245
+ * schedule(TimerTask task, Date time)测试,多个TimerTask任务及延时
+ */
+public class Run1_timer4 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.SECOND,5);
+ Date runDate = calendar.getTime();
+ System.out.println("计划时间为:"+ runDate);
+
+ Calendar calendar2 = Calendar.getInstance();
+ calendar.add(Calendar.SECOND,10);
+ Date runDate2 = calendar2.getTime();
+ System.out.println("计划时间为:"+ runDate2);
+
+ MyTask task1 = new MyTask();
+ MyTask task2 = new MyTask();
+ Timer timer = new Timer();
+ timer.schedule(task1,runDate);
+ timer.schedule(task2,runDate);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:24:08 CST 2016
+计划时间为:Fri Apr 15 22:24:13 CST 2016
+计划时间为:Fri Apr 15 22:24:08 CST 2016
+任务执行了,时间为:Fri Apr 15 22:24:13 CST 2016
+任务执行了,时间为:Fri Apr 15 22:24:13 CST 2016
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..8ce959a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer5.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P246
+ * schedule(TimerTask task, Date time)测试,多个TimerTask任务及延时
+ * 队列的方式,一个一个被顺序执行,前面一个耗时长则后面的任务被延后
+ */
+public class Run1_timer5 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+ System.out.println("A计划时间为:"+ runDate);
+
+ Calendar calendar2 = Calendar.getInstance();
+ calendar2.add(Calendar.SECOND,5);
+ Date runDate2 = calendar2.getTime();
+ 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);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:39:30 CST 2016
+A计划时间为:Fri Apr 15 22:39:30 CST 2016
+B计划时间为:Fri Apr 15 22:39:35 CST 2016
+A begin timer=Fri Apr 15 22:39:30 CST 2016
+A end timer=Fri Apr 15 22:39:40 CST 2016
+B begin timer=Fri Apr 15 22:39:40 CST 2016
+B end timer=Fri Apr 15 22:39:40 CST 2016
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..9030040
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class TaskA extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("A begin timer="+new Date());
+ Thread.sleep(10000);
+ 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
new file mode 100644
index 0000000..adb0bd0
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java
@@ -0,0 +1,15 @@
+package com.brianway.learning.java.multithread.timer.example1;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+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());
+ }
+}
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
new file mode 100644
index 0000000..7c2a555
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.timer.example2;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..1c50401
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period1.java
@@ -0,0 +1,41 @@
+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;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P247
+ * schedule(TimerTask task, long delay, long period) 测试,在未来执行的效果
+ */
+public class Run2_period1 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.SECOND,10);
+ Date runDate = calendar.getTime();
+ System.out.println("计划时间为:"+ runDate);
+
+ MyTask task = new MyTask();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate,4000);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:40:46 CST 2016
+计划时间为:Fri Apr 15 22:40:56 CST 2016
+任务执行了,时间为:Fri Apr 15 22:40:56 CST 2016
+任务执行了,时间为:Fri Apr 15 22:41:00 CST 2016
+任务执行了,时间为:Fri Apr 15 22:41:04 CST 2016
+
+(一直执行,后面省略)
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..5ac84d4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period2.java
@@ -0,0 +1,39 @@
+package com.brianway.learning.java.multithread.timer.example2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P247
+ * schedule(TimerTask task, long delay, long period) 测试,提前运行的效果
+ */
+public class Run2_period2 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-10);
+ Date runDate = calendar.getTime();
+ System.out.println("计划时间为:"+ runDate);
+
+ MyTask task = new MyTask();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate,4000);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:42:32 CST 2016
+计划时间为:Fri Apr 15 22:42:22 CST 2016
+任务执行了,时间为:Fri Apr 15 22:42:32 CST 2016
+任务执行了,时间为:Fri Apr 15 22:42:36 CST 2016
+任务执行了,时间为:Fri Apr 15 22:42:40 CST 2016
+任务执行了,时间为:Fri Apr 15 22:42:44 CST 2016
+
+(一直执行,后面省略)
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..3f91fe4
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/Run2_period3.java
@@ -0,0 +1,42 @@
+package com.brianway.learning.java.multithread.timer.example2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P248
+ * schedule(TimerTask task, long delay, long period) 测试,任务执行时间被延时
+ */
+public class Run2_period3 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.SECOND,10);
+ Date runDate = calendar.getTime();
+ System.out.println("计划时间为:"+ runDate);
+
+ TaskA task = new TaskA();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate,3000);
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 22:44:47 CST 2016
+计划时间为:Fri Apr 15 22:44:57 CST 2016
+A begin timer=Fri Apr 15 22:44:57 CST 2016
+A end timer=Fri Apr 15 22:45:02 CST 2016
+A begin timer=Fri Apr 15 22:45:02 CST 2016
+A end timer=Fri Apr 15 22:45:07 CST 2016
+A begin timer=Fri Apr 15 22:45:07 CST 2016
+A end timer=Fri Apr 15 22:45:12 CST 2016
+A begin timer=Fri Apr 15 22:45:12 CST 2016
+
+(一直执行,后面省略)
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..01373f6
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.timer.example2;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class TaskA extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("A begin timer="+new Date());
+ Thread.sleep(5000);
+ System.out.println("A end timer="+new Date());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
From e282acf0fc60b36f8902b484225b809732886e56 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sat, 16 Apr 2016 00:56:50 +0800
Subject: [PATCH 15/80] =?UTF-8?q?java-multithread=20timer=E5=8C=85?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3example4,=E5=91=8A=E4=B8=80=E6=AE=B5?=
=?UTF-8?q?=E8=90=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../multithread/timer/example3/MyTask.java | 19 +++++
.../timer/example3/Run3_cancel1.java | 44 ++++++++++++
.../timer/example3/Run3_cancel2.java | 50 +++++++++++++
.../timer/example3/Run3_cancel3.java | 49 +++++++++++++
.../multithread/timer/example3/TaskA.java | 16 +++++
.../multithread/timer/example3/TaskA2.java | 14 ++++
.../multithread/timer/example3/TaskB.java | 14 ++++
.../multithread/timer/example3/TaskB2.java | 14 ++++
.../timer/example4/Run4_schedule1.java | 36 ++++++++++
.../timer/example4/Run4_schedule2.java | 39 +++++++++++
.../timer/example4/Run4_schedule3.java | 57 +++++++++++++++
.../timer/example4/Run4_schedule4.java | 51 ++++++++++++++
.../timer/example4/Run4_schedule5.java | 52 ++++++++++++++
.../timer/example4/Run4_schedule6.java | 49 +++++++++++++
.../example4/Run4_scheduleAtFixedRate1.java | 51 ++++++++++++++
.../example4/Run4_scheduleAtFixedRate2.java | 50 +++++++++++++
.../example4/Run4_scheduleAtFixedRate3.java | 52 ++++++++++++++
.../example4/Run4_scheduleAtFixedRate4.java | 48 +++++++++++++
...un4_schedule_vs_scheduleAtFixedRate_1.java | 51 ++++++++++++++
...un4_schedule_vs_scheduleAtFixedRate_2.java | 70 +++++++++++++++++++
20 files changed, 826 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java
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
new file mode 100644
index 0000000..a8e7202
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java
@@ -0,0 +1,19 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.TimerTask;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class MyTask extends TimerTask {
+ private int i;
+
+ public MyTask(int i) {
+ this.i = i;
+ }
+
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..d8128be
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel1.java
@@ -0,0 +1,44 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P249
+ * TimerTask类的cancel()方法
+ * 将自身从任务队列移除,其他任务不受影响
+ */
+public class Run3_cancel1 {
+ public static void main(String[] args) {
+ System.out.println("当前时间为:"+new Date());
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+ System.out.println("计划时间为:"+ runDate);
+
+ TaskA task1 = new TaskA();
+ TaskB task2 =new TaskB();
+ Timer timer = new Timer();
+ timer.schedule(task1,runDate,4000);
+ timer.schedule(task2,runDate,4000);
+
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 23:41:22 CST 2016
+计划时间为:Fri Apr 15 23:41:22 CST 2016
+A run timer=Fri Apr 15 23:41:22 CST 2016
+A任务自己移除自己
+B run timer=Fri Apr 15 23:41:22 CST 2016
+B run timer=Fri Apr 15 23:41:26 CST 2016
+B run timer=Fri Apr 15 23:41:30 CST 2016
+
+
+(一直执行,后面省略)
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..cb9cb53
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel2.java
@@ -0,0 +1,50 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P250
+ * Timer类的cancel()方法
+ * 全部任务被清除,且进程被销毁
+ */
+public class Run3_cancel2 {
+ 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);
+
+ TaskA2 task1 = new TaskA2();
+ TaskB2 task2 =new TaskB2();
+ Timer timer = new Timer();
+ timer.schedule(task1,runDate,2000);
+ timer.schedule(task2,runDate,2000);
+ Thread.sleep(10000);
+ timer.cancel();
+ }
+}
+
+/*
+输出:
+当前时间为:Fri Apr 15 23:49:29 CST 2016
+计划时间为:Fri Apr 15 23:49:29 CST 2016
+A run timer=Fri Apr 15 23:49:29 CST 2016
+B run timer=Fri Apr 15 23:49:29 CST 2016
+A run timer=Fri Apr 15 23:49:31 CST 2016
+B run timer=Fri Apr 15 23:49:31 CST 2016
+A run timer=Fri Apr 15 23:49:33 CST 2016
+B run timer=Fri Apr 15 23:49:33 CST 2016
+B run timer=Fri Apr 15 23:49:35 CST 2016
+A run timer=Fri Apr 15 23:49:35 CST 2016
+A run timer=Fri Apr 15 23:49:37 CST 2016
+B run timer=Fri Apr 15 23:49:37 CST 2016
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..c79febc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/Run3_cancel3.java
@@ -0,0 +1,49 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+
+
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+
+/**
+ * P252
+ * Timer类的cancel()方法
+ * 有时不一定会停止计划任务,(见源码,queue锁)
+ */
+public class Run3_cancel3 {
+ public static void main(String[] args) throws InterruptedException{
+ int i =0;
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+
+ while (true){
+ i++;
+ Timer timer = new Timer();
+ MyTask task = new MyTask(i);
+ timer.schedule(task,runDate);
+ timer.cancel();
+ }
+
+ }
+}
+
+/*
+输出:
+第1次没有被cancel取消
+第44674次没有被cancel取消
+第44676次没有被cancel取消
+第44678次没有被cancel取消
+第44682次没有被cancel取消
+第44684次没有被cancel取消
+第44686次没有被cancel取消
+第44688次没有被cancel取消
+第44697次没有被cancel取消
+第44702次没有被cancel取消
+第44706次没有被cancel取消
+第67967次没有被cancel取消
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..e173713
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class TaskA extends TimerTask{
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..c452727
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class TaskA2 extends TimerTask{
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..5c63c45
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+public class TaskB extends TimerTask{
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..dcb96ac
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java
@@ -0,0 +1,14 @@
+package com.brianway.learning.java.multithread.timer.example3;
+
+import java.util.Date;
+import java.util.TimerTask;
+
+/**
+ * Created by Brian on 2016/4/15.
+ */
+public class TaskB2 extends TimerTask{
+ @Override
+ public void run() {
+ 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
new file mode 100644
index 0000000..47b22c9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java
@@ -0,0 +1,36 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P252
+ * schedule(TimerTask task, long delay)方法
+ */
+public class Run4_schedule1 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ 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);
+ }
+}
+
+/*
+输出:
+当前时间:Sat Apr 16 00:00:22 CST 2016
+运行了!时间为:Sat Apr 16 00:00:29 CST 2016
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..e82c4c1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule2.java
@@ -0,0 +1,39 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P253
+ * schedule(TimerTask task, long delay, long period)方法
+ */
+public class Run4_schedule2 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ 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);
+ }
+}
+
+/*
+输出:
+当前时间:Sat Apr 16 00:01:34 CST 2016
+运行了!时间为:Sat Apr 16 00:01:36 CST 2016
+运行了!时间为:Sat Apr 16 00:01:37 CST 2016
+运行了!时间为:Sat Apr 16 00:01:38 CST 2016
+运行了!时间为:Sat Apr 16 00:01:39 CST 2016
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..3fab0bc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule3.java
@@ -0,0 +1,57 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P254
+ * schedule(TimerTask task, Date firstTime, long period) 方法
+ * Date类型
+ * 不延时的情况下,若执行任务未被延时,下次执行任务的开始时间是上一次任务的开始时间加上period
+ */
+public class Run4_schedule3 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(1000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate,3000);
+ }
+}
+
+/*
+输出:
+begin timer=1460736286532
+end timer=1460736287533
+begin timer=1460736289532
+end timer=1460736290532
+begin timer=1460736292536
+end timer=1460736293536
+begin timer=1460736295536
+end timer=1460736296536
+begin timer=1460736298536
+end timer=1460736299536
+begin timer=1460736301536
+end timer=1460736302536
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..15a09b5
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule4.java
@@ -0,0 +1,51 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P255
+ * schedule(TimerTask task, long delay, long period)方法
+ * long类型
+ * 不延时的情况下,若执行任务未被延时,第一次执行是任务开始+delay,下次执行任务的开始时间是上一次任务的开始时间加上period
+ */
+public class Run4_schedule4 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(1000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ System.out.println("当前时间:"+System.currentTimeMillis());
+ Timer timer = new Timer();
+ timer.schedule(task,3000,4000);
+ }
+}
+
+/*
+输出:
+当前时间:1460736721660
+begin timer=1460736724662
+end timer=1460736725662
+begin timer=1460736728662
+end timer=1460736729662
+begin timer=1460736732662
+end timer=1460736733662
+begin timer=1460736736662
+end timer=1460736737662
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..b6e3aa8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule5.java
@@ -0,0 +1,52 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P255
+ * schedule(TimerTask task, Date firstTime, long period) 方法
+ * Date类型
+ * 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
+ */
+public class Run4_schedule5 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(5000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+ Timer timer = new Timer();
+ timer.schedule(task,runDate,2000);
+ }
+}
+
+/*
+输出:
+begin timer=1460738337277
+end timer=1460738342278
+begin timer=1460738342278
+end timer=1460738347278
+begin timer=1460738347278
+end timer=1460738352278
+begin timer=1460738352278
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..b8532f9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule6.java
@@ -0,0 +1,49 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P256
+ * schedule(TimerTask task, long delay, long period)方法
+ * long类型
+ * 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
+ */
+public class Run4_schedule6 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(5000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ System.out.println("当前时间:"+System.currentTimeMillis());
+ Timer timer = new Timer();
+ timer.schedule(task,3000,2000);
+ }
+}
+
+/*
+输出:
+当前时间:1460737882848
+begin timer=1460737885849
+end timer=1460737890849
+begin timer=1460737890849
+end timer=1460737895849
+begin timer=1460737895849
+end timer=1460737900850
+begin timer=1460737900850
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..fed27c7
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate1.java
@@ -0,0 +1,51 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P257
+ * scheduleAtFixedRate(TimerTask task, Date firstTime,long period)方法
+ * Date类型
+ * 不延时的情况下,若执行任务未被延时,下次执行任务的开始时间是上一次任务的开始时间加上period
+ */
+public class Run4_scheduleAtFixedRate1 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(1000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+ Timer timer = new Timer();
+ timer.scheduleAtFixedRate(task,runDate,3000);
+ }
+}
+
+/*
+输出:
+begin timer=1460738424663
+end timer=1460738425663
+begin timer=1460738427636
+end timer=1460738428636
+begin timer=1460738430635
+end timer=1460738431635
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..a27f004
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate2.java
@@ -0,0 +1,50 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P258
+ * scheduleAtFixedRate(TimerTask task, long delay, long period)方法
+ * long类型
+ * 不延时的情况下,若执行任务未被延时,第一次执行是任务开始+delay,下次执行任务的开始时间是上一次任务的开始时间加上period
+ */
+public class Run4_scheduleAtFixedRate2 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(1000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ System.out.println("当前时间:"+System.currentTimeMillis());
+ Timer timer = new Timer();
+ timer.scheduleAtFixedRate(task,3000,4000);
+ }
+}
+
+/*
+输出:
+当前时间:1460738574939
+begin timer=1460738577940
+end timer=1460738578940
+begin timer=1460738581940
+end timer=1460738582940
+begin timer=1460738585940
+end timer=1460738586940
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..9ad09a8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate3.java
@@ -0,0 +1,52 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P258
+ * scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 方法
+ * Date类型
+ * 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
+ */
+public class Run4_scheduleAtFixedRate3 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(5000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ Calendar calendar = Calendar.getInstance();
+ Date runDate = calendar.getTime();
+ Timer timer = new Timer();
+ timer.scheduleAtFixedRate(task,runDate,2000);
+ }
+}
+
+/*
+输出:
+begin timer=1460738658244
+end timer=1460738663246
+begin timer=1460738663246
+end timer=1460738668247
+begin timer=1460738668247
+end timer=1460738673247
+begin timer=1460738673247
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..22d711b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_scheduleAtFixedRate4.java
@@ -0,0 +1,48 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P259
+ * scheduleAtFixedRate(TimerTask task, long delay, long period)方法
+ * long类型
+ * 在延时的情况下,若执行任务被延时,下次执行任务的开始时间是上一次任务的开始时间作为参考点
+ */
+public class Run4_scheduleAtFixedRate4 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin timer="+ System.currentTimeMillis());
+ Thread.sleep(5000);
+ System.out.println("end timer="+ System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ MyTask task = new MyTask();
+ System.out.println("当前时间:"+System.currentTimeMillis());
+ Timer timer = new Timer();
+ timer.scheduleAtFixedRate(task,3000,2000);
+ }
+}
+
+/*
+输出:
+当前时间:1460738720674
+begin timer=1460738723676
+end timer=1460738728676
+begin timer=1460738728676
+end timer=1460738733676
+begin timer=1460738733676
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..b1f089b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_1.java
@@ -0,0 +1,51 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P260
+ * schedule不具有追赶执行性
+ */
+public class Run4_schedule_vs_scheduleAtFixedRate_1 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ 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());
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-20);
+ Date runDate = calendar.getTime();
+ System.out.println("计划执行时间:"+ runDate);
+ Timer timer = new Timer();
+ timer.schedule(task,runDate,2000);
+ }
+}
+
+/*
+输出:
+现在执行时间:Sat Apr 16 00:51:36 CST 2016
+计划执行时间:Sat Apr 16 00:51:16 CST 2016
+begin timer=Sat Apr 16 00:51:36 CST 2016
+end timer=Sat Apr 16 00:51:36 CST 2016
+begin timer=Sat Apr 16 00:51:38 CST 2016
+end timer=Sat Apr 16 00:51:38 CST 2016
+begin timer=Sat Apr 16 00:51:40 CST 2016
+end timer=Sat Apr 16 00:51:40 CST 2016
+begin timer=Sat Apr 16 00:51:42 CST 2016
+end timer=Sat Apr 16 00:51:42 CST 2016
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..4d34a74
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule_vs_scheduleAtFixedRate_2.java
@@ -0,0 +1,70 @@
+package com.brianway.learning.java.multithread.timer.example4;
+
+/**
+ * Created by brian on 2016/4/15.
+ */
+
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * P261
+ * scheduleAtFixedRate具有追赶执行性
+ */
+public class Run4_schedule_vs_scheduleAtFixedRate_2 {
+ static public class MyTask extends TimerTask{
+ @Override
+ public void run() {
+ 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());
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-20);
+ Date runDate = calendar.getTime();
+ System.out.println("计划执行时间:"+ runDate);
+ Timer timer = new Timer();
+ timer.scheduleAtFixedRate(task,runDate,2000);
+ }
+}
+
+/*
+输出:
+现在执行时间:Sat Apr 16 00:54:46 CST 2016
+计划执行时间:Sat Apr 16 00:54:26 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:46 CST 2016
+end timer=Sat Apr 16 00:54:46 CST 2016
+begin timer=Sat Apr 16 00:54:48 CST 2016
+end timer=Sat Apr 16 00:54:48 CST 2016
+begin timer=Sat Apr 16 00:54:50 CST 2016
+end timer=Sat Apr 16 00:54:50 CST 2016
+begin timer=Sat Apr 16 00:54:52 CST 2016
+end timer=Sat Apr 16 00:54:52 CST 2016
+ */
\ No newline at end of file
From b14aeba2063643cdcc6bb360e9e5593797c2711e Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sat, 16 Apr 2016 22:54:05 +0800
Subject: [PATCH 16/80] =?UTF-8?q?java-multithread=20singleton=E5=8C=85?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3example3,=E5=BE=85=E7=BB=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../singleton/example1/MyObject0.java | 19 ++++++++
.../singleton/example1/MyObject1.java | 18 ++++++++
.../singleton/example1/MyObject2.java | 23 ++++++++++
.../singleton/example1/Run1_singleton0.java | 28 ++++++++++++
.../singleton/example1/Run1_singleton1.java | 43 +++++++++++++++++++
.../singleton/example1/Run1_singleton2.java | 30 +++++++++++++
.../singleton/example1/Thread0.java | 11 +++++
.../singleton/example1/Thread1.java | 11 +++++
.../singleton/example1/Thread2.java | 11 +++++
.../singleton/example2/MyObject1.java | 23 ++++++++++
.../singleton/example2/MyObject2.java | 26 +++++++++++
.../singleton/example2/MyObject3.java | 26 +++++++++++
.../singleton/example2/MyObject4.java | 27 ++++++++++++
.../singleton/example2/Run2_singleton1.java | 33 ++++++++++++++
.../singleton/example2/Run2_singleton2.java | 31 +++++++++++++
.../singleton/example2/Run2_singleton3.java | 31 +++++++++++++
.../singleton/example2/Run2_singleton4.java | 30 +++++++++++++
.../singleton/example2/Thread1.java | 12 ++++++
.../singleton/example2/Thread2.java | 12 ++++++
.../singleton/example2/Thread3.java | 12 ++++++
.../singleton/example2/Thread4.java | 12 ++++++
.../singleton/example3/MyObject1.java | 16 +++++++
.../singleton/example3/Run3_singleton1.java | 29 +++++++++++++
.../singleton/example3/Thread1.java | 13 ++++++
24 files changed, 527 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject0.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread0.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject0.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject0.java
new file mode 100644
index 0000000..49eae92
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject0.java
@@ -0,0 +1,19 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+/**
+ * 缺点:不能有其他实例变量
+ * getInstance()方法没有同步,可能出现非线程安全问题
+ */
+public class MyObject0 {
+ private static MyObject0 myObject = new MyObject0();
+
+ private MyObject0(){}
+
+ public static MyObject0 getInstance(){
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject1.java
new file mode 100644
index 0000000..743a2d8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject1.java
@@ -0,0 +1,18 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject1 {
+ private static MyObject1 myObject;
+
+ private MyObject1(){}
+
+ public static MyObject1 getInstance(){
+ //延迟加载
+ if(myObject == null){
+ myObject = new MyObject1();
+ }
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject2.java
new file mode 100644
index 0000000..62e020b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject2.java
@@ -0,0 +1,23 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject2 {
+ private static MyObject2 myObject;
+
+ private MyObject2(){}
+
+ public static MyObject2 getInstance(){
+
+ try {
+ if(myObject == null){
+ Thread.sleep(2000);//模拟创建对象前的坐一些准备
+ myObject = new MyObject2();
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java
new file mode 100644
index 0000000..0b7f3e3
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+/**
+ * p262
+ * 立即加载/“饿汉模式”
+ */
+public class Run1_singleton0 {
+ public static void main(String[] args) {
+ Thread0 t1 = new Thread0();
+ Thread0 t2 = new Thread0();
+ Thread0 t3 = new Thread0();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08
+663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08
+663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton1.java
new file mode 100644
index 0000000..b421a23
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton1.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+/**
+ * p264
+ * 延迟加载/“懒汉模式”
+ * 会出问题
+ *
+ */
+public class Run1_singleton1 {
+ public static void main(String[] args) {
+ Thread1 t1 = new Thread1();
+ Thread1 t2 = new Thread1();
+ Thread1 t3 = new Thread1();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+541962297 com.brianway.learning.java.multithread.singleton.example1.MyObject1@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject1@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject1@3a1a7da6
+
+---------------------------
+
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject1@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject1@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject1@3a1a7da6
+
+--------------------------
+
+1802892302 com.brianway.learning.java.multithread.singleton.example1.MyObject1@6b75f40e
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject1@6b75f40e
+1771081048 com.brianway.learning.java.multithread.singleton.example1.MyObject1@6b75f40e
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java
new file mode 100644
index 0000000..a2caa90
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+/**
+ * p265
+ * 延迟加载/“懒汉模式”缺点展示
+ *
+ */
+public class Run1_singleton2 {
+ public static void main(String[] args) {
+ Thread2 t1 = new Thread2();
+ Thread2 t2 = new Thread2();
+ Thread2 t3 = new Thread2();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+1771081048 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e
+1802892302 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e
+974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread0.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread0.java
new file mode 100644
index 0000000..23abbe1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread0.java
@@ -0,0 +1,11 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread0 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject0.getInstance().hashCode()+" "+MyObject0.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread1.java
new file mode 100644
index 0000000..cc4c02e
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread1.java
@@ -0,0 +1,11 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread1 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject1.getInstance().hashCode()+" "+MyObject1.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread2.java
new file mode 100644
index 0000000..ad186dd
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread2.java
@@ -0,0 +1,11 @@
+package com.brianway.learning.java.multithread.singleton.example1;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread2 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject2.getInstance().hashCode()+" "+MyObject2.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject1.java
new file mode 100644
index 0000000..ddb0695
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject1.java
@@ -0,0 +1,23 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject1 {
+ private static MyObject1 myObject;
+
+ private MyObject1(){}
+
+ synchronized public static MyObject1 getInstance(){
+
+ try {
+ if(myObject == null){
+ Thread.sleep(3000);//模拟创建对象前的坐一些准备
+ myObject = new MyObject1();
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject2.java
new file mode 100644
index 0000000..145979f
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject2.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject2 {
+ private static MyObject2 myObject;
+
+ private MyObject2(){}
+
+ public static MyObject2 getInstance(){
+
+ try {
+ //此写法和方法前加synchronized一样效率低下,全部代码被上锁
+ synchronized (MyObject2.class){
+ if(myObject == null){
+ Thread.sleep(3000);//模拟创建对象前的坐一些准备
+ myObject = new MyObject2();
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject3.java
new file mode 100644
index 0000000..a2688a6
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject3.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject3 {
+ private static MyObject3 myObject;
+
+ private MyObject3(){}
+
+ public static MyObject3 getInstance(){
+
+ try {
+ if(myObject == null){
+ Thread.sleep(3000);//模拟创建对象前的坐一些准备
+ //虽然部分代码被上锁,但还是有非线程安全问题
+ synchronized (MyObject3.class){
+ myObject = new MyObject3();
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject4.java
new file mode 100644
index 0000000..fe16fdc
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject4.java
@@ -0,0 +1,27 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject4 {
+ private static MyObject4 myObject;
+
+ private MyObject4(){}
+
+ public static MyObject4 getInstance(){
+ //双检查锁机制
+ try {
+ if(myObject == null){
+ Thread.sleep(3000);//模拟创建对象前的坐一些准备
+ synchronized (MyObject4.class){
+ if(myObject == null){
+ myObject = new MyObject4();
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java
new file mode 100644
index 0000000..240b558
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p266
+ * 延迟加载/“懒汉模式”解决方案
+ * 声明synchronized关键字,整个方法上锁
+ * 效率低下,下一个线程想取得对象,须等上一个线程释放锁
+ */
+public class Run2_singleton1 {
+ public static void main(String[] args) {
+ Thread1 t1 = new Thread1();
+ Thread1 t2 = new Thread1();
+ Thread1 t3 = new Thread1();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139
+872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139
+872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java
new file mode 100644
index 0000000..ca2cee9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java
@@ -0,0 +1,31 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p267
+ * 延迟加载/“懒汉模式”解决方案
+ * 声明synchronized关键字,同步代码块
+ * 效率低下
+ */
+public class Run2_singleton2 {
+ public static void main(String[] args) {
+ Thread2 t1 = new Thread2();
+ Thread2 t2 = new Thread2();
+ Thread2 t3 = new Thread2();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java
new file mode 100644
index 0000000..e47a9e8
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java
@@ -0,0 +1,31 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p269
+ * 延迟加载/“懒汉模式”解决方案
+ * 声明synchronized关键字,部分代码上锁
+ * 会出问题
+ */
+public class Run2_singleton3 {
+ public static void main(String[] args) {
+ Thread3 t1 = new Thread3();
+ Thread3 t2 = new Thread3();
+ Thread3 t3 = new Thread3();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+541962297 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba
+974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba
+61956794 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java
new file mode 100644
index 0000000..cdf577e
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p270
+ * 延迟加载/“懒汉模式”解决方案
+ * DCL双检查锁机制
+ */
+public class Run2_singleton4 {
+ public static void main(String[] args) {
+ Thread4 t1 = new Thread4();
+ Thread4 t2 = new Thread4();
+ Thread4 t3 = new Thread4();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037
+2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037
+2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread1.java
new file mode 100644
index 0000000..e95b971
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread1.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread1 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject1.getInstance().hashCode()+" "+MyObject1.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread2.java
new file mode 100644
index 0000000..bcfedf2
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread2.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread2 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject2.getInstance().hashCode()+" "+MyObject2.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread3.java
new file mode 100644
index 0000000..2de5734
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread3.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread3 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject3.getInstance().hashCode()+" "+MyObject3.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread4.java
new file mode 100644
index 0000000..95d65b9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread4.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.singleton.example2;
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread4 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(MyObject4.getInstance().hashCode()+" "+MyObject4.getInstance());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject1.java
new file mode 100644
index 0000000..a7483a1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject1.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject1 {
+ private static class MyObjectHandler{
+ private static MyObject1 myObject = new MyObject1();
+ }
+
+ private MyObject1(){}
+
+ synchronized public static MyObject1 getInstance(){
+ return MyObjectHandler.myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java
new file mode 100644
index 0000000..8e351d1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java
@@ -0,0 +1,29 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p272
+ * 使用静态内置类实现单例模式
+ */
+public class Run3_singleton1 {
+ public static void main(String[] args) {
+ Thread1 t1 = new Thread1();
+ Thread1 t2 = new Thread1();
+ Thread1 t3 = new Thread1();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+1802892302 com.brianway.learning.java.multithread.singleton.example3.MyObject1@65b21710
+1802892302 com.brianway.learning.java.multithread.singleton.example3.MyObject1@65b21710
+1802892302 com.brianway.learning.java.multithread.singleton.example3.MyObject1@65b21710
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java
new file mode 100644
index 0000000..c654f08
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java
@@ -0,0 +1,13 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread1 extends Thread {
+ @Override
+ public void run() {
+ System.out.println(com.brianway.learning.java.multithread.singleton.example2.MyObject1.getInstance().hashCode()+" "+ MyObject1.getInstance());
+ }
+}
From 4b015b5bd0ddc55e4e9252454cf2db1a6ab1ac29 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 17 Apr 2016 01:22:46 +0800
Subject: [PATCH 17/80] =?UTF-8?q?java-multithread=20singleton=E5=8C=85?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3example3,=E5=91=8A=E4=B8=80=E6=AE=B5?=
=?UTF-8?q?=E8=90=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../singleton/example3/MyObject2.java | 23 +++++++
.../singleton/example3/MyObject3.java | 20 ++++++
.../singleton/example3/MyObject4.java | 23 +++++++
.../singleton/example3/MyObject5.java | 30 +++++++++
.../singleton/example3/Run3_singleton1.java | 6 +-
.../singleton/example3/Run3_singleton2.java | 61 +++++++++++++++++++
.../singleton/example3/Run3_singleton3.java | 42 +++++++++++++
.../singleton/example3/Run3_singleton4.java | 43 +++++++++++++
.../singleton/example3/Run3_singleton5.java | 44 +++++++++++++
.../singleton/example3/Thread1.java | 2 +-
.../singleton/example3/Thread3.java | 16 +++++
.../singleton/example3/Thread4.java | 16 +++++
.../singleton/example3/Thread5.java | 16 +++++
13 files changed, 338 insertions(+), 4 deletions(-)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject5.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton5.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread4.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread5.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject2.java
new file mode 100644
index 0000000..f0bfaf1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject2.java
@@ -0,0 +1,23 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+import java.io.Serializable;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject2 implements Serializable {
+ private static class MyObjectHandler{
+ private static final MyObject2 myObject = new MyObject2();
+ }
+
+ private MyObject2(){}
+
+ synchronized public static MyObject2 getInstance(){
+ return MyObjectHandler.myObject;
+ }
+
+ protected Object readResolve() {
+ System.out.println("调用了readResolve方法");
+ return MyObjectHandler.myObject;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject3.java
new file mode 100644
index 0000000..c6d0fe9
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject3.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject3 {
+
+ private static MyObject3 instance = null;
+
+ private MyObject3(){}
+
+ static {
+ instance = new MyObject3();
+ }
+
+ public static MyObject3 getInstance(){
+ return instance;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject4.java
new file mode 100644
index 0000000..f446aca
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject4.java
@@ -0,0 +1,23 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public enum MyObject4 {
+ ObjectFactory;
+ private Object object;
+ private MyObject4(){
+ try {
+ Thread.sleep(3000);//模拟初始化
+ object = new Object();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Object getObject(){
+ return object;
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject5.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject5.java
new file mode 100644
index 0000000..cfa6c68
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject5.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class MyObject5{
+ public enum MyEnumSingleton {
+ ObjectFactory;
+ private Object object;
+ private MyEnumSingleton(){
+ try {
+ Thread.sleep(3000);//模拟初始化
+ object = new Object();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Object getObject(){
+ return object;
+ }
+ }
+
+ public static Object getObject(){
+ return MyEnumSingleton.ObjectFactory.getObject();
+ }
+
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java
index 8e351d1..6aeac3c 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java
@@ -23,7 +23,7 @@ public static void main(String[] args) {
/*
输出:
-1802892302 com.brianway.learning.java.multithread.singleton.example3.MyObject1@65b21710
-1802892302 com.brianway.learning.java.multithread.singleton.example3.MyObject1@65b21710
-1802892302 com.brianway.learning.java.multithread.singleton.example3.MyObject1@65b21710
+418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c
+418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c
+418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c
*/
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton2.java
new file mode 100644
index 0000000..7cc820a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton2.java
@@ -0,0 +1,61 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+import java.io.*;
+
+/**
+ * p273
+ * 序列化与反序列化的单例模式实现
+ *
+ */
+public class Run3_singleton2 {
+ public static void main(String[] args) {
+ try {
+ MyObject2 myObject = MyObject2.getInstance();
+ FileOutputStream fos = new FileOutputStream(new File("myObject.txt"));
+ ObjectOutputStream oos = new ObjectOutputStream(fos);
+ oos.writeObject(myObject);
+ oos.close();
+ fos.close();
+ System.out.println(myObject.hashCode()+" "+ myObject);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ try {
+ FileInputStream fis = new FileInputStream(new File("myObject.txt"));
+ ObjectInputStream ios = new ObjectInputStream(fis);
+ MyObject2 myObject = (MyObject2) ios.readObject();
+ ios.close();
+ fis.close();
+ System.out.println(myObject.hashCode()+" "+ myObject);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e ){
+ e.printStackTrace();
+ } catch (ClassNotFoundException e){
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*
+输出:
+325040804 com.brianway.learning.java.multithread.singleton.example3.MyObject2@135fbaa4
+1173230247 com.brianway.learning.java.multithread.singleton.example3.MyObject2@45ee12a7
+
+------------------------
+取消MyObject2中protected Object readResolve()的注释
+输出:
+325040804 com.brianway.learning.java.multithread.singleton.example3.MyObject2@135fbaa4
+调用了readResolve方法
+325040804 com.brianway.learning.java.multithread.singleton.example3.MyObject2@135fbaa4
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton3.java
new file mode 100644
index 0000000..18cf2eb
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton3.java
@@ -0,0 +1,42 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p275
+ * 使用static代码块实现单例模式
+ */
+public class Run3_singleton3 {
+ public static void main(String[] args) {
+ Thread3 t1 = new Thread3();
+ Thread3 t2 = new Thread3();
+ Thread3 t3 = new Thread3();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+974814630 com.brianway.learning.java.multithread.singleton.example3.MyObject3@3a1a7da6
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton4.java
new file mode 100644
index 0000000..e69a66a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton4.java
@@ -0,0 +1,43 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p276
+ * 使用enum枚举数据类型实现单例模式
+ */
+public class Run3_singleton4 {
+ public static void main(String[] args) {
+ Thread4 t1 = new Thread4();
+ Thread4 t2 = new Thread4();
+ Thread4 t3 = new Thread4();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+61956794 java.lang.Object@3b162ba
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton5.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton5.java
new file mode 100644
index 0000000..cc9319a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton5.java
@@ -0,0 +1,44 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+
+
+/**
+ * p277
+ * 使用enum枚举数据类型实现单例模式
+ * 完善
+ */
+public class Run3_singleton5 {
+ public static void main(String[] args) {
+ Thread5 t1 = new Thread5();
+ Thread5 t2 = new Thread5();
+ Thread5 t3 = new Thread5();
+ t1.start();
+ t2.start();
+ t3.start();
+ }
+}
+
+
+/*
+输出:
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+541962297 java.lang.Object@204db039
+
+
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java
index c654f08..b42d686 100644
--- a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java
@@ -8,6 +8,6 @@
public class Thread1 extends Thread {
@Override
public void run() {
- System.out.println(com.brianway.learning.java.multithread.singleton.example2.MyObject1.getInstance().hashCode()+" "+ MyObject1.getInstance());
+ System.out.println(MyObject1.getInstance().hashCode()+" "+ MyObject1.getInstance());
}
}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread3.java
new file mode 100644
index 0000000..cad4a3d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread3.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread3 extends Thread {
+ @Override
+ public void run() {
+ for (int i = 0; i<5;i++){
+ System.out.println(MyObject3.getInstance().hashCode()+" "+ MyObject3.getInstance());
+ }
+
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread4.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread4.java
new file mode 100644
index 0000000..2ecd428
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread4.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread4 extends Thread {
+ @Override
+ public void run() {
+ for (int i = 0; i<5;i++){
+ System.out.println(MyObject4.ObjectFactory.getObject().hashCode()+" "+ MyObject4.ObjectFactory.getObject());
+ }
+
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread5.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread5.java
new file mode 100644
index 0000000..176a015
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread5.java
@@ -0,0 +1,16 @@
+package com.brianway.learning.java.multithread.singleton.example3;
+
+
+
+/**
+ * Created by Brian on 2016/4/16.
+ */
+public class Thread5 extends Thread {
+ @Override
+ public void run() {
+ for (int i = 0; i<5;i++){
+ System.out.println(MyObject5.getObject().hashCode()+" "+ MyObject5.getObject());
+ }
+
+ }
+}
From 9732c15d5f45d6a51cff199e42e35ffbcc655600 Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sun, 17 Apr 2016 19:33:56 +0800
Subject: [PATCH 18/80] =?UTF-8?q?java-multithread=20supplement=E5=8C=85?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3example6,=E5=91=8A=E4=B8=80=E6=AE=B5?=
=?UTF-8?q?=E8=90=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../supplement/example1/MyService.java | 15 ++++
.../supplement/example1/Run1_state1.java | 35 +++++++++
.../supplement/example1/Run1_state2.java | 32 ++++++++
.../supplement/example1/Run1_state3.java | 35 +++++++++
.../supplement/example1/Thread1.java | 17 ++++
.../supplement/example1/Thread2.java | 20 +++++
.../supplement/example1/Thread3.java | 12 +++
.../supplement/example2/MyThread.java | 50 ++++++++++++
.../example2/Run2_autoAddGroup.java | 37 +++++++++
.../example2/Run2_getGroupParent.java | 37 +++++++++
.../example2/Run2_groupAddThread.java | 35 +++++++++
.../Run2_groupAddThreadMoreLevel.java | 48 ++++++++++++
.../example2/Run2_threadRunSyn.java | 34 ++++++++
.../supplement/example2/ThreadA.java | 18 +++++
.../supplement/example2/ThreadB.java | 18 +++++
.../supplement/example3/DateTools1.java | 19 +++++
.../supplement/example3/DateTools2.java | 23 ++++++
.../supplement/example3/Run3_formatError.java | 49 ++++++++++++
.../supplement/example3/Run3_formatOK1.java | 34 ++++++++
.../supplement/example3/Run3_formatOK2.java | 34 ++++++++
.../supplement/example3/Thread0.java | 33 ++++++++
.../supplement/example3/Thread1.java | 33 ++++++++
.../supplement/example3/Thread2.java | 33 ++++++++
.../example4/Run4_threadCreateException.java | 22 ++++++
.../example4/Run4_threadCreateException2.java | 45 +++++++++++
.../example4/Run4_threadCreateException3.java | 38 +++++++++
.../supplement/example4/Thread1.java | 12 +++
.../example5/Run5_threadGroup1.java | 26 +++++++
.../example5/Run5_threadGroup2.java | 38 +++++++++
.../supplement/example5/Thread1.java | 21 +++++
.../supplement/example5/Thread2.java | 21 +++++
.../supplement/example5/ThreadGroup2.java | 17 ++++
.../supplement/example6/MyThread.java | 21 +++++
.../supplement/example6/MyThreadGroup.java | 18 +++++
.../ObjectUncaughtExceptionHandler.java | 13 ++++
.../example6/Run6_threadExceptionMove1.java | 51 ++++++++++++
.../example6/Run6_threadExceptionMove2.java | 77 +++++++++++++++++++
.../StateUncaughtExceptionHandler.java | 14 ++++
38 files changed, 1135 insertions(+)
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/MyService.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/MyThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_autoAddGroup.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_getGroupParent.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThreadMoreLevel.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_threadRunSyn.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/ThreadA.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/ThreadB.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/DateTools1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/DateTools2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread0.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Thread1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Thread2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/ThreadGroup2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/MyThread.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/MyThreadGroup.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/ObjectUncaughtExceptionHandler.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/Run6_threadExceptionMove1.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/Run6_threadExceptionMove2.java
create mode 100644 java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/StateUncaughtExceptionHandler.java
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/MyService.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/MyService.java
new file mode 100644
index 0000000..204bc68
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/MyService.java
@@ -0,0 +1,15 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class MyService {
+ synchronized static public void serviveMethod(){
+ try {
+ System.out.println(Thread.currentThread().getName()+" 进入了业务方法");
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state1.java
new file mode 100644
index 0000000..d5a0774
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state1.java
@@ -0,0 +1,35 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * P280
+ * 验证NEW,RUNNABLE,TERMINATED
+ */
+public class Run1_state1 {
+ public static void main(String[] args) {
+ try {
+ Thread1 t = new Thread1();
+ System.out.println("main方法中的状态1:"+t.getState()+" of "+t.getName());
+ Thread.sleep(1000);
+ t.start();
+ Thread.sleep(1000);
+ System.out.println("main方法中的状态2:"+t.getState()+" of "+t.getName());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*
+输出:
+构造方法中的状态:NEW of Thread-0
+构造方法中的状态:RUNNABLE of main
+main方法中的状态1:NEW of Thread-0
+run方法中的状态:RUNNABLE of Thread-0
+run方法中的状态:RUNNABLE of Thread-0
+main方法中的状态2:TERMINATED of Thread-0
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java
new file mode 100644
index 0000000..559d17a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * P282
+ * 验证TIMED_WAITING
+ */
+public class Run1_state2 {
+ public static void main(String[] args) {
+ try {
+ Thread2 t = new Thread2();
+ t.start();
+ Thread.sleep(1000);
+ System.out.println("main方法中的状态:"+t.getState()+" of "+t.getName());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+/*
+输出:
+begin sleep,run方法中的状态:RUNNABLE of Thread-0
+begin sleep,run方法中的状态:RUNNABLE of Thread-0
+main方法中的状态:TIMED_WAITING of Thread-0
+end sleep,run方法中的状态:RUNNABLE of Thread-0
+end sleep,run方法中的状态:RUNNABLE of Thread-0
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java
new file mode 100644
index 0000000..5732f6a
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java
@@ -0,0 +1,35 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * P283
+ * 验证BLOCKED
+ */
+public class Run1_state3 {
+ public static void main(String[] args) {
+ try {
+ Thread3 t1 = new Thread3();
+ t1.setName("a");
+ t1.start();
+ Thread3 t2 = new Thread3();
+ t2.setName("b");
+ t2.start();
+ Thread.sleep(1000);
+ System.out.println("main方法中的t2状态:"+t2.getState());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
+
+
+/*
+输出:
+a 进入了业务方法
+main方法中的t2状态:BLOCKED
+b 进入了业务方法
+ */
\ No newline at end of file
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread1.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread1.java
new file mode 100644
index 0000000..02b0dd7
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread1.java
@@ -0,0 +1,17 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread1 extends Thread{
+ public Thread1() {
+ System.out.println("构造方法中的状态:"+this.getState()+" of "+this.getName());
+ System.out.println("构造方法中的状态:"+Thread.currentThread().getState()+" of "+Thread.currentThread().getName());
+ }
+
+ @Override
+ public void run() {
+ System.out.println("run方法中的状态:"+this.getState()+" of "+this.getName());
+ System.out.println("run方法中的状态:"+Thread.currentThread().getState()+" of "+Thread.currentThread().getName());
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread2.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread2.java
new file mode 100644
index 0000000..c71ea2d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread2.java
@@ -0,0 +1,20 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread2 extends Thread{
+
+ @Override
+ public void run() {
+ try {
+ System.out.println("begin sleep,run方法中的状态:"+this.getState()+" of "+this.getName());
+ System.out.println("begin sleep,run方法中的状态:"+Thread.currentThread().getState()+" of "+Thread.currentThread().getName());
+ Thread.sleep(10000);
+ System.out.println("end sleep,run方法中的状态:"+this.getState()+" of "+this.getName());
+ System.out.println("end sleep,run方法中的状态:"+Thread.currentThread().getState()+" of "+Thread.currentThread().getName());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread3.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread3.java
new file mode 100644
index 0000000..ac3f87d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread3.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.supplement.example1;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread3 extends Thread{
+
+ @Override
+ public void run() {
+ MyService.serviveMethod();
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/MyThread.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/MyThread.java
new file mode 100644
index 0000000..cdaa8d1
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/MyThread.java
@@ -0,0 +1,50 @@
+package com.brianway.learning.java.multithread.supplement.example2;
+
+import sun.security.provider.SHA;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * 取消System.out.println的注释能看到更多细节
+ */
+public class MyThread extends Thread {
+ private Object lock;
+ private String showChar;
+ private int showNumPosition;
+ private int printCount = 0;//统计打印了几个字母
+ volatile private static int addNumber = 1;
+
+ public MyThread(Object lock, String showChar, int showNumPosition) {
+ this.lock = lock;
+ this.showChar = showChar;
+ this.showNumPosition = showNumPosition;
+ }
+
+
+ @Override
+ public void run() {
+ try {
+ synchronized (lock){
+ //System.out.println("ThreadName="+ Thread.currentThread().getName()+" get the lock");
+ while (true){
+ if(addNumber % 3 == showNumPosition){
+ System.out.println("ThreadName="+ Thread.currentThread().getName()
+ +" runCount = "+addNumber+ " "+ showChar);
+ lock.notifyAll();
+ addNumber++;
+ printCount++;
+ if(printCount == 3){break;}
+ }else {
+ //System.out.println("ThreadName="+ Thread.currentThread().getName()+" will await");
+ lock.wait();
+ //System.out.println("ThreadName="+ Thread.currentThread().getName()+" after await");
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_autoAddGroup.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_autoAddGroup.java
new file mode 100644
index 0000000..029c780
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_autoAddGroup.java
@@ -0,0 +1,37 @@
+package com.brianway.learning.java.multithread.supplement.example2;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * 线程组自动归属特性
+ */
+public class Run2_autoAddGroup {
+ public static void main(String[] args) {
+ System.out.println("A处线程:"+Thread.currentThread().getName()
+ +" 所属的线程组名为:"+Thread.currentThread().getThreadGroup().getName()
+ +" 中有线程组数量:"+ Thread.currentThread().getThreadGroup().activeGroupCount());
+
+ ThreadGroup group = new ThreadGroup("新的组");
+
+ System.out.println("A处线程:"+Thread.currentThread().getName()
+ +" 所属的线程组名为:"+Thread.currentThread().getThreadGroup().getName()
+ +" 中有线程组数量:"+ Thread.currentThread().getThreadGroup().activeGroupCount());
+
+ ThreadGroup[] threadGroup = new ThreadGroup[Thread.currentThread().getThreadGroup().activeGroupCount()];
+ Thread.currentThread().getThreadGroup().enumerate(threadGroup);
+ for(int i=0;itl = new ThreadLocal();
+
+ public static SimpleDateFormat getSimpleDateFormat(String datePattern){
+ SimpleDateFormat sdf = null;
+ sdf = tl.get();
+ if(sdf == null){
+ sdf = new SimpleDateFormat(datePattern);
+ tl.set(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
new file mode 100644
index 0000000..bae3e35
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatError.java
@@ -0,0 +1,49 @@
+package com.brianway.learning.java.multithread.supplement.example3;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+import java.text.SimpleDateFormat;
+
+/**
+ * P293
+ * SimpleDateFormat类非线程安全
+ * 有时正常运行,有时报异常
+ */
+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"
+ };
+ 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].start();
+ }
+ }
+}
+
+/*
+ThreadName = Thread-6报错了 日期字符串:2000-01-07 转换成的日期为1999-12-02
+ThreadName = Thread-4报错了 日期字符串:2000-01-05 转换成的日期为2000-01-09
+ThreadName = Thread-1报错了 日期字符串:2000-01-02 转换成的日期为1999-12-02
+ThreadName = Thread-0报错了 日期字符串:2000-01-01 转换成的日期为2000-01-05
+ThreadName = Thread-5报错了 日期字符串:2000-01-06 转换成的日期为1999-12-03
+Exception in thread "Thread-3" java.lang.NumberFormatException: For input string: ""
+ at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
+ at java.lang.Long.parseLong(Long.java:601)
+ at java.lang.Long.parseLong(Long.java:631)
+ at java.text.DigitList.getLong(DigitList.java:195)
+ at java.text.DecimalFormat.parse(DecimalFormat.java:2051)
+ at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)
+ at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
+ at java.text.DateFormat.parse(DateFormat.java:364)
+ at com.brianway.learning.java.multithread.supplement.example3.Thread0.run(Thread0.java:22)
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..5cd1b0c
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK1.java
@@ -0,0 +1,34 @@
+package com.brianway.learning.java.multithread.supplement.example3;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+import java.text.SimpleDateFormat;
+
+/**
+ * P295
+ * SimpleDateFormat类非线程安全,解决异常方法1
+ */
+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"
+ };
+ 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].start();
+ }
+ }
+}
+
+/*
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..583b86d
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Run3_formatOK2.java
@@ -0,0 +1,34 @@
+package com.brianway.learning.java.multithread.supplement.example3;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+import java.text.SimpleDateFormat;
+
+/**
+ * P296
+ * SimpleDateFormat类非线程安全,解决异常方法2
+ */
+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"
+ };
+ 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].start();
+ }
+ }
+}
+
+/*
+
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..dd91418
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread0.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.supplement.example3;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread0 extends Thread{
+ private SimpleDateFormat sdf;
+ private String dateString;
+
+ public Thread0(SimpleDateFormat sdf,String dateString){
+ this.sdf =sdf;
+ this.dateString = dateString;
+ }
+
+ @Override
+ 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
+ + " 转换成的日期为" + newDateString);
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+}
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
new file mode 100644
index 0000000..acbee5e
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread1.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.supplement.example3;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread1 extends Thread{
+ private SimpleDateFormat sdf;
+ private String dateString;
+
+ 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
+ + " 转换成的日期为" + newDateString);
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+}
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
new file mode 100644
index 0000000..1bf15dd
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/Thread2.java
@@ -0,0 +1,33 @@
+package com.brianway.learning.java.multithread.supplement.example3;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread2 extends Thread{
+ private SimpleDateFormat sdf;
+ private String dateString;
+
+ public Thread2(SimpleDateFormat sdf, String dateString){
+ this.sdf =sdf;
+ this.dateString = dateString;
+ }
+
+ @Override
+ 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
+ + " 转换成的日期为" + newDateString);
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java
new file mode 100644
index 0000000..0729ad2
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java
@@ -0,0 +1,22 @@
+package com.brianway.learning.java.multithread.supplement.example4;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * P297
+ * 线程中出现异常
+ */
+public class Run4_threadCreateException {
+ public static void main(String[] args) {
+ Thread1 t = new Thread1();
+ t.start();
+ }
+}
+
+/*
+输出:
+Exception in thread "Thread-0" java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..f456b0b
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException2.java
@@ -0,0 +1,45 @@
+package com.brianway.learning.java.multithread.supplement.example4;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * P298
+ * 线程中出现异常,捕捉
+ */
+public class Run4_threadCreateException2 {
+ public static void main(String[] args) {
+ Thread1 t1 = new Thread1();
+ t1.setName("thread t1");
+ t1.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+ public void uncaughtException(Thread t, Throwable e) {
+ System.out.println("线程:"+t.getName()+" 出现了异常:");
+ e.printStackTrace();
+ }
+ });
+ t1.start();
+ Thread1 t2 = new Thread1();
+ t2.setName("thread t2");
+ t2.start();
+
+ }
+}
+
+/*
+输出:
+线程:thread t1 出现了异常:
+Exception in thread "thread t2" java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+
+------------------------------
+
+Exception in thread "thread t2" 线程:thread t1 出现了异常:
+java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..5b8895e
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException3.java
@@ -0,0 +1,38 @@
+package com.brianway.learning.java.multithread.supplement.example4;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * P298
+ * 线程中出现异常,捕捉
+ */
+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()+" 出现了异常:");
+ e.printStackTrace();
+ }
+ });
+ Thread1 t1 = new Thread1();
+ t1.setName("thread t1");
+ t1.start();
+ Thread1 t2 = new Thread1();
+ t2.setName("thread t2");
+ t2.start();
+
+ }
+}
+
+/*
+输出:
+java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+java.lang.NullPointerException
+ at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
+线程:thread t1 出现了异常:
+线程:thread t2 出现了异常:
+
+ */
\ No newline at end of file
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
new file mode 100644
index 0000000..06e3eb3
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java
@@ -0,0 +1,12 @@
+package com.brianway.learning.java.multithread.supplement.example4;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+public class Thread1 extends Thread{
+ @Override
+ public void run() {
+ String username = null;
+ System.out.println(username.hashCode());
+ }
+}
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
new file mode 100644
index 0000000..2d46100
--- /dev/null
+++ b/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java
@@ -0,0 +1,26 @@
+package com.brianway.learning.java.multithread.supplement.example5;
+
+/**
+ * Created by Brian on 2016/4/17.
+ */
+
+/**
+ * p299
+ * 线程组内处理异常
+ */
+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;i
Date: Sun, 21 Aug 2016 15:52:41 +0800
Subject: [PATCH 19/80] [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 20/80] [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 21/80] [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 22/80] [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 23/80] [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 24/80] [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 25/80] [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 26/80] [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 27/80] [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 28/80] [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 29/80] [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 30/80] [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 31/80] [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 32/80] [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 33/80] [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 34/80] [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 35/80] [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 36/80] [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 37/80] [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 38/80] [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 39/80] [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 40/80] [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 41/80] [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