From cdd8cae6f3b127e6fabcb4f890f92a8072aef0d0 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年5月19日 08:58:37 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CopyOnWriteArrayListTest.java | 16 ---------------- .../CopyOnWriteArraySetTest.java | 17 ----------------- .../concurrency/CountDownLatch/Conference.java | 12 ------------ 3 files changed, 45 deletions(-) diff --git a/src/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java b/src/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java index 15e81cd..0113334 100644 --- a/src/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java +++ b/src/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java @@ -4,23 +4,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -/** - * CopyOnWriteArrayList Ϊ�̰߳�ȫ�Ķ�̬����,ArrayList���̲߳���ȫ��
- * �ڲ��������£�����̲߳���listɦ:
- * --��listΪArrayList�����ܻ����ConcurrentModification�쳣
- * --��listΪCopyWriteArrayList���򲻻�����쳣 - * @Project:javaConcurrency - * @file:CopyOnWriteArrayListTest.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - * - * @data:2015��10��9�� - */ public class CopyOnWriteArrayListTest { -// private static List list = new ArrayList(); private static List list = new CopyOnWriteArrayList(); public static void main(String[] args) { diff --git a/src/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java b/src/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java index b132db3..c613b3c 100644 --- a/src/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java +++ b/src/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java @@ -4,24 +4,7 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; -/** - * CopyOnWriteArraySet�ǡ��̰߳�ȫ���ļ��ϣ���HashSet�Ƿ��̰߳�ȫ��
- * �ڲ��������£�����̲߳���Setɦ:
- * --��listΪHashSet�����ܻ����ConcurrentModification�쳣
- * --��listΪCopyOnWriteArraySet���򲻻�����쳣 - * @Project:javaConcurrency - * @file:CopyOnWriteArraySetTest.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - *t - * @data:2015��10��12�� - */ public class CopyOnWriteArraySetTest { -// private static Set setes = new HashSet(); - private static Set setes = new CopyOnWriteArraySet(); public static void main(String[] args) { diff --git a/src/com/javaCore/concurrency/CountDownLatch/Conference.java b/src/com/javaCore/concurrency/CountDownLatch/Conference.java index f1937c0..3c13443 100644 --- a/src/com/javaCore/concurrency/CountDownLatch/Conference.java +++ b/src/com/javaCore/concurrency/CountDownLatch/Conference.java @@ -2,18 +2,6 @@ import java.util.concurrent.CountDownLatch; -/** - * - * @Project:javaConcurrency - * @file:Conference.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - * - * @data:2015��9��6�� - */ public class Conference implements Runnable{ private final CountDownLatch countDown; From e9e8553a88c44be4a45b266dbbff5a60c060d618 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Thu, 4 Aug 2016 10:03:59 +0800 Subject: [PATCH 02/25] =?UTF-8?q?1.=E8=B0=83=E6=95=B4=E4=B8=BAmaven?= =?UTF-8?q?=E7=BB=93=E6=9E=84=20=20=201.=E5=A2=9E=E5=8A=A0CAS=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 21 - .gitignore | 6 +- .idea/.name | 1 + .idea/compiler.xml | 33 + .idea/copyright/profiles_settings.xml | 3 + .idea/encodings.xml | 4 + .idea/libraries/Maven__junit_junit_3_8_1.xml | 13 + .idea/libraries/Maven__junit_junit_4_11.xml | 13 + .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 + .idea/misc.xml | 176 +++++ .idea/modules.xml | 8 + .idea/scopes/scope_settings.xml | 5 + .idea/uiDesigner.xml | 124 +++ .idea/vcs.xml | 6 + .idea/workspace.xml | 734 ++++++++++++++++++ .project | 23 - .settings/org.eclipse.core.resources.prefs | 2 - .settings/org.eclipse.jdt.core.prefs | 12 - .settings/org.eclipse.m2e.core.prefs | 4 - JavaCore.iml | 17 + pom.xml | 10 + src/com/javaCore/junit/_1/CalculatorTest.java | 60 -- src/com/javaCore/junit/_1/Test.java | 138 ---- .../com/javaCore/concurrency/CAS/Counter.java | 66 ++ .../ConcurrentHashMapTest.java | 1 + .../CopyOnWriteArrayListTest.java | 0 .../CopyOnWriteArraySetTest.java | 0 .../CountDownLatch/Conference.java | 0 .../CountDownLatch/Participater.java | 0 .../concurrency/CountDownLatch/Test.java | 0 .../CyclicBarrier/CyclicBarrierTest_1.java | 0 .../CyclicBarrier/CyclicBarrierTest_2.java | 0 .../concurrency/Exchanger/Consumer.java | 0 .../concurrency/Exchanger/Producer.java | 0 .../javaCore/concurrency/Exchanger/Test.java | 0 .../concurrency/Phaser/PhaserTest_1.java | 0 .../concurrency/Phaser/PhaserTest_2.java | 0 .../concurrency/Phaser/PhaserTest_3.java | 0 .../concurrency/Phaser/PhaserTest_4.java | 0 .../concurrency/Phaser/PhaserTest_5.java | 0 .../concurrency/Phaser/PhaserTest_6.java | 0 .../concurrency/Phaser/PhaserTest_7.java | 0 .../concurrency/ReentrantLock/Job.java | 0 .../concurrency/ReentrantLock/PrintQueue.java | 0 .../concurrency/ReentrantLock/Test.java | 0 .../ReentrantReadWriteLock/PricesInfo.java | 0 .../ReentrantReadWriteLock/Reader.java | 0 .../ReentrantReadWriteLock/Test.java | 0 .../ReentrantReadWriteLock/Writer.java | 0 .../javaCore/concurrency/Semaphore/Job.java | 0 .../concurrency/Semaphore/PrintQueue.java | 0 .../javaCore/concurrency/Semaphore/Test.java | 0 .../concurrency/condition/Customer.java | 0 .../javaCore/concurrency/condition/Depot.java | 0 .../concurrency/condition/Producer.java | 0 .../javaCore/concurrency/condition/Test.java | 0 .../concurrency/synchronize/Account.java | 0 .../concurrency/synchronize/Bank.java | 0 .../concurrency/synchronize/Company.java | 0 .../com/javaCore/junit/_1/Calculator.java | 74 +- .../java}/com/javaCore/jvm/_1/JConsole.java | 48 +- .../java}/com/javaCore/proxy/_1/Client.java | 18 +- .../com/javaCore/proxy/_1/ProxySubject.java | 34 +- .../com/javaCore/proxy/_1/RealSubject.java | 60 +- .../java}/com/javaCore/proxy/_1/Subject.java | 36 +- .../java}/com/javaCore/proxy/_2/Client.java | 30 +- .../com/javaCore/proxy/_2/DynamicSubject.java | 78 +- .../com/javaCore/proxy/_2/RealSubject.java | 58 +- .../java}/com/javaCore/proxy/_2/Subject.java | 10 +- 69 files changed, 1454 insertions(+), 485 deletions(-) delete mode 100644 .classpath create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/libraries/Maven__junit_junit_3_8_1.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_11.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/scopes/scope_settings.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml delete mode 100644 .project delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 JavaCore.iml delete mode 100644 src/com/javaCore/junit/_1/CalculatorTest.java delete mode 100644 src/com/javaCore/junit/_1/Test.java create mode 100644 src/main/java/com/javaCore/concurrency/CAS/Counter.java rename src/{ => main/java}/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java (86%) rename src/{ => main/java}/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/CountDownLatch/Conference.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/CountDownLatch/Participater.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/CountDownLatch/Test.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Exchanger/Consumer.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Exchanger/Producer.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Exchanger/Test.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_1.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_2.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_3.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_4.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_5.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_6.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Phaser/PhaserTest_7.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantLock/Job.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantLock/PrintQueue.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantLock/Test.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Semaphore/Job.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Semaphore/PrintQueue.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/Semaphore/Test.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/condition/Customer.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/condition/Depot.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/condition/Producer.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/condition/Test.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/synchronize/Account.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/synchronize/Bank.java (100%) rename src/{ => main/java}/com/javaCore/concurrency/synchronize/Company.java (100%) rename src/{ => main/java}/com/javaCore/junit/_1/Calculator.java (94%) rename src/{ => main/java}/com/javaCore/jvm/_1/JConsole.java (95%) rename src/{ => main/java}/com/javaCore/proxy/_1/Client.java (96%) rename src/{ => main/java}/com/javaCore/proxy/_1/ProxySubject.java (72%) rename src/{ => main/java}/com/javaCore/proxy/_1/RealSubject.java (63%) rename src/{ => main/java}/com/javaCore/proxy/_1/Subject.java (68%) rename src/{ => main/java}/com/javaCore/proxy/_2/Client.java (93%) rename src/{ => main/java}/com/javaCore/proxy/_2/DynamicSubject.java (71%) rename src/{ => main/java}/com/javaCore/proxy/_2/RealSubject.java (63%) rename src/{ => main/java}/com/javaCore/proxy/_2/Subject.java (93%) diff --git a/.classpath b/.classpath deleted file mode 100644 index 3ddabb9..0000000 --- a/.classpath +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/.gitignore b/.gitignore index 09e3bc9..23fed15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ -/bin/ + /target/ + +.idea/ +*.iml +target/ \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..8b1f01b --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +JavaCore \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..ab856f2 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..d821048 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_3_8_1.xml b/.idea/libraries/Maven__junit_junit_3_8_1.xml new file mode 100644 index 0000000..71b2993 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_3_8_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_11.xml b/.idea/libraries/Maven__junit_junit_4_11.xml new file mode 100644 index 0000000..f33320d --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3057019 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7 + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fe9ef32 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..922003b --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + +
    + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..fdbb660 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,734 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1470272484036 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.7 + + + + + + + + JavaCore + + + + + + + + 1.7 + + + + + + + + Maven: junit:junit:3.8.1 + + + + + + + + \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index f072237..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - JavaCore - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4824b80..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f4217b0..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/JavaCore.iml b/JavaCore.iml new file mode 100644 index 0000000..0672cbc --- /dev/null +++ b/JavaCore.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3513e99..3ce17a8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,6 +3,16 @@ JavaCore JavaCore 0.0.1-SNAPSHOT + + + + junit + junit + 3.8.1 + test + + + src diff --git a/src/com/javaCore/junit/_1/CalculatorTest.java b/src/com/javaCore/junit/_1/CalculatorTest.java deleted file mode 100644 index 25e6a0e..0000000 --- a/src/com/javaCore/junit/_1/CalculatorTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.javaCore.junit._1; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -public class CalculatorTest { - private static Calculator calculator = new Calculator(); - - @Before - public void setUp() throws Exception { - calculator.clear(); - } - - @Test - public void testAdd() { - calculator.add(2); - calculator.add(3); - assertEquals(5, calculator.getResult()); - } - - @Test - public void testSubstract() { - calculator.add(10); - calculator.substract(2); - assertEquals(8, calculator.getResult()); - } - - @Test - public void testMultiply() { - fail("Not yet implemented"); - } - - @Test - public void testDivide() { - fail("Not yet implemented"); - } - - @Test - public void testSquare() { - fail("Not yet implemented"); - } - - @Test - public void testSquareRoot() { - fail("Not yet implemented"); - } - - @Test - public void testClear() { - fail("Not yet implemented"); - } - - @Test - public void testGetResult() { - fail("Not yet implemented"); - } - -} diff --git a/src/com/javaCore/junit/_1/Test.java b/src/com/javaCore/junit/_1/Test.java deleted file mode 100644 index d743e1e..0000000 --- a/src/com/javaCore/junit/_1/Test.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.javaCore.junit._1; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.security.KeyStore; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509TrustManager; -public class Test implements X509TrustManager { - /* - * The default X509TrustManager returned by SunX509. We'll delegate - * decisions to it, and fall back to the logic in this class if the - * default X509TrustManager doesn't trust it. - */ - X509TrustManager sunJSSEX509TrustManager; - Test() throws Exception { - // create a "default" JSSE X509TrustManager. - KeyStore ks = KeyStore.getInstance("JKS"); - ks.load(new FileInputStream("e:/apache-tomcat-6.0.43/conf/keystore.jks"), "ufclub218comszljs".toCharArray()); - TrustManagerFactory tmf = - TrustManagerFactory.getInstance("SunX509", "SunJSSE"); - tmf.init(ks); - TrustManager tms [] = tmf.getTrustManagers(); - /* - * Iterate over the returned trustmanagers, look - * for an instance of X509TrustManager. If found, - * use that as our "default" trust manager. - */ - for (int i = 0; i < tms.length; i++) { - if (tms[i] instanceof X509TrustManager) { - sunJSSEX509TrustManager = (X509TrustManager) tms[i]; - return; - } - } - /* - * Find some other way to initialize, or else we have to fail the - * constructor. - */ - throw new Exception("Couldn't initialize"); - } - /* - * Delegate to the default trust manager. - */ - public void checkClientTrusted(X509Certificate[] chain, String authType) - throws CertificateException { - try { - sunJSSEX509TrustManager.checkClientTrusted(chain, authType); - } catch (CertificateException excep) { - // do any special handling here, or rethrow exception. - } - } - /* - * Delegate to the default trust manager. - */ - public void checkServerTrusted(X509Certificate[] chain, String authType) - throws CertificateException { - try { - sunJSSEX509TrustManager.checkServerTrusted(chain, authType); - } catch (CertificateException excep) { - /* - * Possibly pop up a dialog box asking whether to trust the - * cert chain. - */ - } - } - /* - * Merely pass this through. - */ - public X509Certificate[] getAcceptedIssuers() { - return sunJSSEX509TrustManager.getAcceptedIssuers(); - } - public static void main(String[] args) { - try{ - // 创建SSLContext对象,并使用我们指定的信任管理器初始化 - TrustManager[] tm = { new Test() }; - SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); - sslContext.init(null, tm, new java.security.SecureRandom()); - // 从上述SSLContext对象中得到SSLSocketFactory对象 - SSLSocketFactory ssf = sslContext.getSocketFactory(); - // 创建URL对象 - URL myURL = new URL(null,"https://2.uf-club.com/images/wap/hook.png",new sun.net.www.protocol.https.Handler()); - // 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象 - HttpsURLConnection httpsConn = (HttpsURLConnection) myURL.openConnection(); - httpsConn.setSSLSocketFactory(ssf); - // 取得该连接的输入流,以读取响应内容 - InputStream inStream = httpsConn.getInputStream();//通过输入流获取图片数据 - byte[] btImg = readInputStream(inStream);//得到图片的二进制数据 - - if(null != btImg && btImg.length> 0){ - String fileName = "213.gif"; - writeImageToDisk(btImg, fileName); - } - - } catch(Exception e){ - e.printStackTrace(); - } - } - - public static byte[] readInputStream(InputStream inStream) throws Exception{ - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while( (len=inStream.read(buffer)) != -1 ){ - outStream.write(buffer, 0, len); - } - inStream.close(); - return outStream.toByteArray(); - } - - /** - * 将图片写入到磁盘 - * @param img 图片数据流 - * @param fileName 文件保存时的名称 - */ - public static void writeImageToDisk(byte[] img, String fileName){ - try { - File file = new File("C:\\" + fileName); - FileOutputStream fops = new FileOutputStream(file); - fops.write(img); - fops.flush(); - fops.close(); - System.out.println("图片已经写入到C盘"); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/javaCore/concurrency/CAS/Counter.java b/src/main/java/com/javaCore/concurrency/CAS/Counter.java new file mode 100644 index 0000000..7a4552a --- /dev/null +++ b/src/main/java/com/javaCore/concurrency/CAS/Counter.java @@ -0,0 +1,66 @@ +package com.javaCore.concurrency.CAS; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 演示CAS操作。在java中自旋CAS实现的基本思路是循环进行CAS操作直到成功为止 + * + * @author:chenssy + * @date : 2016年8月4日 9:09 + */ +public class Counter { + private AtomicInteger atomicI = new AtomicInteger(0); + private int i = 0; + /** + * 线程不安全的++ + */ + private void count(){ + i++; + } + + /** + * 使用AtomicInteger线程安全的++ + */ + private void safeCount(){ + for(;;){ + int i = atomicI.get(); + if(atomicI.compareAndSet(i,++i)){ + break; + } + } + } + + public static void main(String[] args) throws InterruptedException { + final Counter cas = new Counter(); + List ts = new ArrayList(600); + long start = System.currentTimeMillis(); + + for(int i = 0 ; i < 100 ; i++){ + Thread j = new Thread(new Runnable() { + @Override + public void run() { + for(int j = 0 ; j < 1000 ; j++){ + cas.count(); + cas.safeCount(); + } + } + }); + ts.add(j); + } + + for(Thread t : ts){ + t.start(); + } + + for(Thread t : ts){ + t.join(); //等待线程执行完成 + } + + System.out.println(cas.i); + System.out.println(cas.atomicI.get()); + System.out.println(System.currentTimeMillis() - start); + } + +} diff --git a/src/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java b/src/main/java/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java similarity index 86% rename from src/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java rename to src/main/java/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java index 3ef70ec..68e10f0 100644 --- a/src/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java +++ b/src/main/java/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java @@ -3,5 +3,6 @@ import java.util.concurrent.ConcurrentHashMap; public class ConcurrentHashMapTest { + @SuppressWarnings("rawtypes") private ConcurrentHashMap maps = new ConcurrentHashMap(); } diff --git a/src/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java b/src/main/java/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java similarity index 100% rename from src/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java rename to src/main/java/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java diff --git a/src/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java b/src/main/java/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java similarity index 100% rename from src/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java rename to src/main/java/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java diff --git a/src/com/javaCore/concurrency/CountDownLatch/Conference.java b/src/main/java/com/javaCore/concurrency/CountDownLatch/Conference.java similarity index 100% rename from src/com/javaCore/concurrency/CountDownLatch/Conference.java rename to src/main/java/com/javaCore/concurrency/CountDownLatch/Conference.java diff --git a/src/com/javaCore/concurrency/CountDownLatch/Participater.java b/src/main/java/com/javaCore/concurrency/CountDownLatch/Participater.java similarity index 100% rename from src/com/javaCore/concurrency/CountDownLatch/Participater.java rename to src/main/java/com/javaCore/concurrency/CountDownLatch/Participater.java diff --git a/src/com/javaCore/concurrency/CountDownLatch/Test.java b/src/main/java/com/javaCore/concurrency/CountDownLatch/Test.java similarity index 100% rename from src/com/javaCore/concurrency/CountDownLatch/Test.java rename to src/main/java/com/javaCore/concurrency/CountDownLatch/Test.java diff --git a/src/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java b/src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java similarity index 100% rename from src/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java rename to src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java diff --git a/src/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java b/src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java similarity index 100% rename from src/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java rename to src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java diff --git a/src/com/javaCore/concurrency/Exchanger/Consumer.java b/src/main/java/com/javaCore/concurrency/Exchanger/Consumer.java similarity index 100% rename from src/com/javaCore/concurrency/Exchanger/Consumer.java rename to src/main/java/com/javaCore/concurrency/Exchanger/Consumer.java diff --git a/src/com/javaCore/concurrency/Exchanger/Producer.java b/src/main/java/com/javaCore/concurrency/Exchanger/Producer.java similarity index 100% rename from src/com/javaCore/concurrency/Exchanger/Producer.java rename to src/main/java/com/javaCore/concurrency/Exchanger/Producer.java diff --git a/src/com/javaCore/concurrency/Exchanger/Test.java b/src/main/java/com/javaCore/concurrency/Exchanger/Test.java similarity index 100% rename from src/com/javaCore/concurrency/Exchanger/Test.java rename to src/main/java/com/javaCore/concurrency/Exchanger/Test.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_1.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_1.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_1.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_1.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_2.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_2.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_2.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_2.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_3.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_3.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_3.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_3.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_4.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_4.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_4.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_4.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_5.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_5.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_5.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_5.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_6.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_6.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_6.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_6.java diff --git a/src/com/javaCore/concurrency/Phaser/PhaserTest_7.java b/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_7.java similarity index 100% rename from src/com/javaCore/concurrency/Phaser/PhaserTest_7.java rename to src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_7.java diff --git a/src/com/javaCore/concurrency/ReentrantLock/Job.java b/src/main/java/com/javaCore/concurrency/ReentrantLock/Job.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantLock/Job.java rename to src/main/java/com/javaCore/concurrency/ReentrantLock/Job.java diff --git a/src/com/javaCore/concurrency/ReentrantLock/PrintQueue.java b/src/main/java/com/javaCore/concurrency/ReentrantLock/PrintQueue.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantLock/PrintQueue.java rename to src/main/java/com/javaCore/concurrency/ReentrantLock/PrintQueue.java diff --git a/src/com/javaCore/concurrency/ReentrantLock/Test.java b/src/main/java/com/javaCore/concurrency/ReentrantLock/Test.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantLock/Test.java rename to src/main/java/com/javaCore/concurrency/ReentrantLock/Test.java diff --git a/src/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java b/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java rename to src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java diff --git a/src/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java b/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java rename to src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java diff --git a/src/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java b/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java rename to src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java diff --git a/src/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java b/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java similarity index 100% rename from src/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java rename to src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java diff --git a/src/com/javaCore/concurrency/Semaphore/Job.java b/src/main/java/com/javaCore/concurrency/Semaphore/Job.java similarity index 100% rename from src/com/javaCore/concurrency/Semaphore/Job.java rename to src/main/java/com/javaCore/concurrency/Semaphore/Job.java diff --git a/src/com/javaCore/concurrency/Semaphore/PrintQueue.java b/src/main/java/com/javaCore/concurrency/Semaphore/PrintQueue.java similarity index 100% rename from src/com/javaCore/concurrency/Semaphore/PrintQueue.java rename to src/main/java/com/javaCore/concurrency/Semaphore/PrintQueue.java diff --git a/src/com/javaCore/concurrency/Semaphore/Test.java b/src/main/java/com/javaCore/concurrency/Semaphore/Test.java similarity index 100% rename from src/com/javaCore/concurrency/Semaphore/Test.java rename to src/main/java/com/javaCore/concurrency/Semaphore/Test.java diff --git a/src/com/javaCore/concurrency/condition/Customer.java b/src/main/java/com/javaCore/concurrency/condition/Customer.java similarity index 100% rename from src/com/javaCore/concurrency/condition/Customer.java rename to src/main/java/com/javaCore/concurrency/condition/Customer.java diff --git a/src/com/javaCore/concurrency/condition/Depot.java b/src/main/java/com/javaCore/concurrency/condition/Depot.java similarity index 100% rename from src/com/javaCore/concurrency/condition/Depot.java rename to src/main/java/com/javaCore/concurrency/condition/Depot.java diff --git a/src/com/javaCore/concurrency/condition/Producer.java b/src/main/java/com/javaCore/concurrency/condition/Producer.java similarity index 100% rename from src/com/javaCore/concurrency/condition/Producer.java rename to src/main/java/com/javaCore/concurrency/condition/Producer.java diff --git a/src/com/javaCore/concurrency/condition/Test.java b/src/main/java/com/javaCore/concurrency/condition/Test.java similarity index 100% rename from src/com/javaCore/concurrency/condition/Test.java rename to src/main/java/com/javaCore/concurrency/condition/Test.java diff --git a/src/com/javaCore/concurrency/synchronize/Account.java b/src/main/java/com/javaCore/concurrency/synchronize/Account.java similarity index 100% rename from src/com/javaCore/concurrency/synchronize/Account.java rename to src/main/java/com/javaCore/concurrency/synchronize/Account.java diff --git a/src/com/javaCore/concurrency/synchronize/Bank.java b/src/main/java/com/javaCore/concurrency/synchronize/Bank.java similarity index 100% rename from src/com/javaCore/concurrency/synchronize/Bank.java rename to src/main/java/com/javaCore/concurrency/synchronize/Bank.java diff --git a/src/com/javaCore/concurrency/synchronize/Company.java b/src/main/java/com/javaCore/concurrency/synchronize/Company.java similarity index 100% rename from src/com/javaCore/concurrency/synchronize/Company.java rename to src/main/java/com/javaCore/concurrency/synchronize/Company.java diff --git a/src/com/javaCore/junit/_1/Calculator.java b/src/main/java/com/javaCore/junit/_1/Calculator.java similarity index 94% rename from src/com/javaCore/junit/_1/Calculator.java rename to src/main/java/com/javaCore/junit/_1/Calculator.java index be075db..fea343a 100644 --- a/src/com/javaCore/junit/_1/Calculator.java +++ b/src/main/java/com/javaCore/junit/_1/Calculator.java @@ -1,37 +1,37 @@ -package com.javaCore.junit._1; - -public class Calculator { - private static int result; // 静态变量,用于存储运行结果 - - public void add(int n) { - result = result + n; - } - - public void substract(int n) { - result = result - 1; // Bug: 正确的应该是 result =result-n - } - - public void multiply(int n) { - } // 此方法尚未写好 - - public void divide(int n) { - result = result / n; - } - - public void square(int n) { - result = n * n; - } - - public void squareRoot(int n) { - for (;;) - ; // Bug : 死循环 - } - - public void clear() { // 将结果清零 - result = 0; - } - - public int getResult() { - return result; - } -} +package com.javaCore.junit._1; + +public class Calculator { + private static int result; // 静态变量,用于存储运行结果 + + public void add(int n) { + result = result + n; + } + + public void substract(int n) { + result = result - 1; // Bug: 正确的应该是 result =result-n + } + + public void multiply(int n) { + } // 此方法尚未写好 + + public void divide(int n) { + result = result / n; + } + + public void square(int n) { + result = n * n; + } + + public void squareRoot(int n) { + for (;;) + ; // Bug : 死循环 + } + + public void clear() { // 将结果清零 + result = 0; + } + + public int getResult() { + return result; + } +} diff --git a/src/com/javaCore/jvm/_1/JConsole.java b/src/main/java/com/javaCore/jvm/_1/JConsole.java similarity index 95% rename from src/com/javaCore/jvm/_1/JConsole.java rename to src/main/java/com/javaCore/jvm/_1/JConsole.java index 1559cd4..8413cde 100644 --- a/src/com/javaCore/jvm/_1/JConsole.java +++ b/src/main/java/com/javaCore/jvm/_1/JConsole.java @@ -1,24 +1,24 @@ -package com.javaCore.jvm._1; - -import java.util.ArrayList; -import java.util.List; - - -public class JConsole { - static class OOMObject{ - public byte[] placeholder = new byte[64 * 1024]; - } - - public static void fillHeap(int numb) throws InterruptedException { - List list = new ArrayList(); - for(int i = 0 ; i < numb ; i++){ - Thread.sleep(500); - list.add(new OOMObject()); - } - System.gc(); - } - - public static void main(String[] args) throws InterruptedException { - fillHeap(1000); - } -} +package com.javaCore.jvm._1; + +import java.util.ArrayList; +import java.util.List; + + +public class JConsole { + static class OOMObject{ + public byte[] placeholder = new byte[64 * 1024]; + } + + public static void fillHeap(int numb) throws InterruptedException { + List list = new ArrayList(); + for(int i = 0 ; i < numb ; i++){ + Thread.sleep(500); + list.add(new OOMObject()); + } + System.gc(); + } + + public static void main(String[] args) throws InterruptedException { + fillHeap(1000); + } +} diff --git a/src/com/javaCore/proxy/_1/Client.java b/src/main/java/com/javaCore/proxy/_1/Client.java similarity index 96% rename from src/com/javaCore/proxy/_1/Client.java rename to src/main/java/com/javaCore/proxy/_1/Client.java index fa0b4e1..f43cec9 100644 --- a/src/com/javaCore/proxy/_1/Client.java +++ b/src/main/java/com/javaCore/proxy/_1/Client.java @@ -1,10 +1,10 @@ -package com.javaCore.proxy._1; - -public class Client { - public static void main(String[] args) { - RealSubject realSubject = new RealSubject("chenssy"); - - ProxySubject proxySubject = new ProxySubject(realSubject); - proxySubject.request(); - } +package com.javaCore.proxy._1; + +public class Client { + public static void main(String[] args) { + RealSubject realSubject = new RealSubject("chenssy"); + + ProxySubject proxySubject = new ProxySubject(realSubject); + proxySubject.request(); + } } \ No newline at end of file diff --git a/src/com/javaCore/proxy/_1/ProxySubject.java b/src/main/java/com/javaCore/proxy/_1/ProxySubject.java similarity index 72% rename from src/com/javaCore/proxy/_1/ProxySubject.java rename to src/main/java/com/javaCore/proxy/_1/ProxySubject.java index a399c12..8f8a616 100644 --- a/src/com/javaCore/proxy/_1/ProxySubject.java +++ b/src/main/java/com/javaCore/proxy/_1/ProxySubject.java @@ -1,18 +1,16 @@ -package com.javaCore.proxy._1; - -public class ProxySubject implements Subject{ - - private RealSubject realSubject; - - public ProxySubject(RealSubject realSubject){ - this.realSubject = realSubject; - } - - @Override - public void request() { - System.out.println("���ô���ǰ......"); - realSubject.request(); - System.out.println("���ô�����......"); - } - -} +package com.javaCore.proxy._1; + +public class ProxySubject implements Subject{ + + private RealSubject realSubject; + + public ProxySubject(RealSubject realSubject){ + this.realSubject = realSubject; + } + + @Override + public void request() { + realSubject.request(); + } + +} diff --git a/src/com/javaCore/proxy/_1/RealSubject.java b/src/main/java/com/javaCore/proxy/_1/RealSubject.java similarity index 63% rename from src/com/javaCore/proxy/_1/RealSubject.java rename to src/main/java/com/javaCore/proxy/_1/RealSubject.java index 8812293..a7e446c 100644 --- a/src/com/javaCore/proxy/_1/RealSubject.java +++ b/src/main/java/com/javaCore/proxy/_1/RealSubject.java @@ -1,30 +1,30 @@ -package com.javaCore.proxy._1; - -/** - * - * ��ɻ��ɫ��������ɫ����������ɻ����������������Ҫ���õĶ��� - * - * @Project:JavaCore - * @file:RealSubject.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - * - * @data:2016��1��6�� - */ -public class RealSubject implements Subject{ - - private String name; - - public RealSubject(String name){ - this.name = name; - } - - @Override - public void request() { - System.out.println(name + "----��ɻ��ɫ......"); - } - -} +package com.javaCore.proxy._1; + +/** + * + * ��ɻ��ɫ�������ɫ���������ɻ��������������Ҫ���õĶ��� + * + * @Project:JavaCore + * @file:RealSubject.java + * + * @Author:chenssy + * @email:chenssy995812509@163.com + * @url : http://cmsblogs.com + * @qq : 122448894 + * + * @data:2016��1��6�� + */ +public class RealSubject implements Subject{ + + private String name; + + public RealSubject(String name){ + this.name = name; + } + + @Override + public void request() { + System.out.println(name + "----��ɻ��ɫ......"); + } + +} diff --git a/src/com/javaCore/proxy/_1/Subject.java b/src/main/java/com/javaCore/proxy/_1/Subject.java similarity index 68% rename from src/com/javaCore/proxy/_1/Subject.java rename to src/main/java/com/javaCore/proxy/_1/Subject.java index 30ebbd8..f10b550 100644 --- a/src/com/javaCore/proxy/_1/Subject.java +++ b/src/main/java/com/javaCore/proxy/_1/Subject.java @@ -1,18 +1,18 @@ -package com.javaCore.proxy._1; - -/** - * ������ɫ��������ɻ�����ʹ��������Ĺ�ͬ�ӿ� - * - * @Project:JavaCore - * @file:Subject.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - * - * @data:2016��1��6�� - */ -public interface Subject { - void request(); -} +package com.javaCore.proxy._1; + +/** + * �����ɫ��������ɻ����ʹ������Ĺ�ͬ�ӿ� + * + * @Project:JavaCore + * @file:Subject.java + * + * @Author:chenssy + * @email:chenssy995812509@163.com + * @url : http://cmsblogs.com + * @qq : 122448894 + * + * @data:2016��1��6�� + */ +public interface Subject { + void request(); +} diff --git a/src/com/javaCore/proxy/_2/Client.java b/src/main/java/com/javaCore/proxy/_2/Client.java similarity index 93% rename from src/com/javaCore/proxy/_2/Client.java rename to src/main/java/com/javaCore/proxy/_2/Client.java index e68bded..614a8c9 100644 --- a/src/com/javaCore/proxy/_2/Client.java +++ b/src/main/java/com/javaCore/proxy/_2/Client.java @@ -1,15 +1,15 @@ -package com.javaCore.proxy._2; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Proxy; - -public class Client { - public static void main(String[] args) { - RealSubject realSubject = new RealSubject("chenssy"); - InvocationHandler ds = new DynamicSubject(realSubject); - - //���ɴ����� - Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),ds); - subject.request(); - } -} +package com.javaCore.proxy._2; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; + +public class Client { + public static void main(String[] args) { + RealSubject realSubject = new RealSubject("chenssy"); + InvocationHandler ds = new DynamicSubject(realSubject); + + //���ɴ����� + Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),ds); + subject.request(); + } +} diff --git a/src/com/javaCore/proxy/_2/DynamicSubject.java b/src/main/java/com/javaCore/proxy/_2/DynamicSubject.java similarity index 71% rename from src/com/javaCore/proxy/_2/DynamicSubject.java rename to src/main/java/com/javaCore/proxy/_2/DynamicSubject.java index a37facc..5ad8d1e 100644 --- a/src/com/javaCore/proxy/_2/DynamicSubject.java +++ b/src/main/java/com/javaCore/proxy/_2/DynamicSubject.java @@ -1,39 +1,39 @@ -package com.javaCore.proxy._2; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; - -/** - * �������� - * - * @Project:JavaCore - * @file:DynamicSubject.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - * - * @data:2016��1��6�� - */ -public class DynamicSubject implements InvocationHandler{ - - private Object object; - - public DynamicSubject(Object object){ - this.object = object; - } - - @Override - public Object invoke(Object proxy, Method method, Object[] args) - throws Throwable { - System.out.println("���ô�����֮ǰ��ִ�еķ���...." + method); - - method.invoke(object, args); - - System.out.println("���ô�����֮����ִ�еķ���...." + method); - - return null; - } - -} +package com.javaCore.proxy._2; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * �������� + * + * @Project:JavaCore + * @file:DynamicSubject.java + * + * @Author:chenssy + * @email:chenssy995812509@163.com + * @url : http://cmsblogs.com + * @qq : 122448894 + * + * @data:2016��1��6�� + */ +public class DynamicSubject implements InvocationHandler{ + + private Object object; + + public DynamicSubject(Object object){ + this.object = object; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + System.out.println("���ô�����֮ǰ��ִ�еķ���...." + method); + + method.invoke(object, args); + + System.out.println("���ô�����֮��ִ�еķ���...." + method); + + return null; + } + +} diff --git a/src/com/javaCore/proxy/_2/RealSubject.java b/src/main/java/com/javaCore/proxy/_2/RealSubject.java similarity index 63% rename from src/com/javaCore/proxy/_2/RealSubject.java rename to src/main/java/com/javaCore/proxy/_2/RealSubject.java index 3b0558f..ddb0e5a 100644 --- a/src/com/javaCore/proxy/_2/RealSubject.java +++ b/src/main/java/com/javaCore/proxy/_2/RealSubject.java @@ -1,29 +1,29 @@ -package com.javaCore.proxy._2; - -/** - * - * ��ɻ��ɫ��������ɫ����������ɻ����������������Ҫ���õĶ��� - * - * @Project:JavaCore - * @file:RealSubject.java - * - * @Author:chenssy - * @email:chenssy995812509@163.com - * @url : http://cmsblogs.com - * @qq : 122448894 - * - * @data:2016��1��6�� - */ -public class RealSubject implements Subject{ - - private String name; - - public RealSubject(String name){ - this.name = name; - } - - @Override - public void request() { - System.out.println(name + "----��ɻ��ɫ......"); - } -} +package com.javaCore.proxy._2; + +/** + * + * ��ɻ��ɫ�������ɫ���������ɻ��������������Ҫ���õĶ��� + * + * @Project:JavaCore + * @file:RealSubject.java + * + * @Author:chenssy + * @email:chenssy995812509@163.com + * @url : http://cmsblogs.com + * @qq : 122448894 + * + * @data:2016��1��6�� + */ +public class RealSubject implements Subject{ + + private String name; + + public RealSubject(String name){ + this.name = name; + } + + @Override + public void request() { + System.out.println(name + "----��ɻ��ɫ......"); + } +} diff --git a/src/com/javaCore/proxy/_2/Subject.java b/src/main/java/com/javaCore/proxy/_2/Subject.java similarity index 93% rename from src/com/javaCore/proxy/_2/Subject.java rename to src/main/java/com/javaCore/proxy/_2/Subject.java index c07221d..30fcb84 100644 --- a/src/com/javaCore/proxy/_2/Subject.java +++ b/src/main/java/com/javaCore/proxy/_2/Subject.java @@ -1,5 +1,5 @@ -package com.javaCore.proxy._2; - -public interface Subject { - void request(); -} +package com.javaCore.proxy._2; + +public interface Subject { + void request(); +} From eb55523c255884ff094cf22b9efd7657f0ae2239 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Mon, 8 Aug 2016 09:26:45 +0800 Subject: [PATCH 03/25] =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 478 ++++++++++++++---- .../JUC}/CAS/Counter.java | 2 +- .../ConcurrentHashMapTest.java | 2 +- .../CopyOnWriteArrayListTest.java | 2 +- .../CopyOnWriteArraySetTest.java | 2 +- .../JUC}/CountDownLatch/Conference.java | 2 +- .../JUC}/CountDownLatch/Participater.java | 2 +- .../JUC}/CountDownLatch/Test.java | 2 +- .../CyclicBarrier/CyclicBarrierTest_1.java | 2 +- .../CyclicBarrier/CyclicBarrierTest_2.java | 2 +- .../JUC}/Exchanger/Consumer.java | 2 +- .../JUC}/Exchanger/Producer.java | 2 +- .../JUC}/Exchanger/Test.java | 2 +- .../JUC}/Phaser/PhaserTest_1.java | 2 +- .../JUC}/Phaser/PhaserTest_2.java | 2 +- .../JUC}/Phaser/PhaserTest_3.java | 2 +- .../JUC}/Phaser/PhaserTest_4.java | 4 +- .../JUC}/Phaser/PhaserTest_5.java | 2 +- .../JUC}/Phaser/PhaserTest_6.java | 2 +- .../JUC}/Phaser/PhaserTest_7.java | 2 +- .../JUC}/ReentrantLock/Job.java | 2 +- .../JUC}/ReentrantLock/PrintQueue.java | 2 +- .../JUC}/ReentrantLock/Test.java | 2 +- .../ReentrantReadWriteLock/PricesInfo.java | 2 +- .../JUC}/ReentrantReadWriteLock/Reader.java | 2 +- .../JUC}/ReentrantReadWriteLock/Test.java | 2 +- .../JUC}/ReentrantReadWriteLock/Writer.java | 2 +- .../JUC}/Semaphore/Job.java | 2 +- .../JUC}/Semaphore/PrintQueue.java | 2 +- .../JUC}/Semaphore/Test.java | 2 +- .../JUC}/condition/Customer.java | 2 +- .../JUC}/condition/Depot.java | 2 +- .../JUC}/condition/Producer.java | 2 +- .../JUC}/condition/Test.java | 2 +- .../JUC}/synchronize/Account.java | 2 +- .../JUC}/synchronize/Bank.java | 2 +- .../JUC}/synchronize/Company.java | 2 +- .../java_thread/basic/MultiThread.java | 26 + .../java_thread/basic/ThreadState.java | 65 +++ 39 files changed, 497 insertions(+), 146 deletions(-) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CAS/Counter.java (97%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ConcurrentHashMap/ConcurrentHashMapTest.java (76%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java (93%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java (92%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CountDownLatch/Conference.java (95%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CountDownLatch/Participater.java (84%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CountDownLatch/Test.java (88%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CyclicBarrier/CyclicBarrierTest_1.java (91%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/CyclicBarrier/CyclicBarrierTest_2.java (93%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Exchanger/Consumer.java (94%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Exchanger/Producer.java (96%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Exchanger/Test.java (91%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_1.java (94%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_2.java (96%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_3.java (96%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_4.java (91%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_5.java (95%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_6.java (97%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Phaser/PhaserTest_7.java (97%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantLock/Job.java (82%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantLock/PrintQueue.java (93%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantLock/Test.java (85%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantReadWriteLock/PricesInfo.java (92%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantReadWriteLock/Reader.java (87%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantReadWriteLock/Test.java (88%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/ReentrantReadWriteLock/Writer.java (89%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Semaphore/Job.java (92%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Semaphore/PrintQueue.java (94%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/Semaphore/Test.java (86%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/condition/Customer.java (82%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/condition/Depot.java (98%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/condition/Producer.java (86%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/condition/Test.java (87%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/synchronize/Account.java (92%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/synchronize/Bank.java (87%) rename src/main/java/com/javaCore/{concurrency => java_thread/JUC}/synchronize/Company.java (87%) create mode 100644 src/main/java/com/javaCore/java_thread/basic/MultiThread.java create mode 100644 src/main/java/com/javaCore/java_thread/basic/ThreadState.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index fdbb660..688a82c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,60 +2,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80,7 +63,30 @@ - + + + + + + + + + + + + + + + + + + + + + + + + @@ -119,8 +128,8 @@ @@ -147,6 +156,8 @@ + + @@ -165,10 +176,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - @@ -186,6 +359,8 @@ + + @@ -193,7 +368,51 @@ - + + + + + + + + + + + + + @@ -308,6 +527,12 @@ + + + + + true + @@ -457,14 +682,14 @@ - + - - - + - + + + + + + + + + @@ -495,46 +728,48 @@ - - - + + - - + + - - - - - - + + + + + + - + - + - - - - - - - - - - + + + + + + + + + + + - - + + @@ -566,7 +801,6 @@ - @@ -574,7 +808,6 @@ - @@ -582,7 +815,6 @@ - @@ -590,19 +822,10 @@ - - - - - - - - - - + @@ -610,7 +833,7 @@ - + @@ -618,7 +841,7 @@ - + @@ -626,7 +849,7 @@ - + @@ -634,10 +857,47 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + diff --git a/src/main/java/com/javaCore/concurrency/CAS/Counter.java b/src/main/java/com/javaCore/java_thread/JUC/CAS/Counter.java similarity index 97% rename from src/main/java/com/javaCore/concurrency/CAS/Counter.java rename to src/main/java/com/javaCore/java_thread/JUC/CAS/Counter.java index 7a4552a..67b4cc7 100644 --- a/src/main/java/com/javaCore/concurrency/CAS/Counter.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CAS/Counter.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CAS; +package com.javaCore.java_thread.JUC.CAS; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java b/src/main/java/com/javaCore/java_thread/JUC/ConcurrentHashMap/ConcurrentHashMapTest.java similarity index 76% rename from src/main/java/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java rename to src/main/java/com/javaCore/java_thread/JUC/ConcurrentHashMap/ConcurrentHashMapTest.java index 68e10f0..ba8a57b 100644 --- a/src/main/java/com/javaCore/concurrency/ConcurrentHashMap/ConcurrentHashMapTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ConcurrentHashMap/ConcurrentHashMapTest.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ConcurrentHashMap; +package com.javaCore.java_thread.JUC.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java b/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java similarity index 93% rename from src/main/java/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java rename to src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java index 0113334..8a3d324 100644 --- a/src/main/java/com/javaCore/concurrency/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CopyOnWriteArrayList; +package com.javaCore.java_thread.JUC.CopyOnWriteArrayList; import java.util.Iterator; import java.util.List; diff --git a/src/main/java/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java b/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java similarity index 92% rename from src/main/java/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java rename to src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java index c613b3c..5d81bbc 100644 --- a/src/main/java/com/javaCore/concurrency/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CopyOnWriteArraySet; +package com.javaCore.java_thread.JUC.CopyOnWriteArraySet; import java.util.Iterator; import java.util.Set; diff --git a/src/main/java/com/javaCore/concurrency/CountDownLatch/Conference.java b/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Conference.java similarity index 95% rename from src/main/java/com/javaCore/concurrency/CountDownLatch/Conference.java rename to src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Conference.java index 3c13443..a70032f 100644 --- a/src/main/java/com/javaCore/concurrency/CountDownLatch/Conference.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Conference.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CountDownLatch; +package com.javaCore.java_thread.JUC.CountDownLatch; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaCore/concurrency/CountDownLatch/Participater.java b/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Participater.java similarity index 84% rename from src/main/java/com/javaCore/concurrency/CountDownLatch/Participater.java rename to src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Participater.java index 9a7bfd5..1472629 100644 --- a/src/main/java/com/javaCore/concurrency/CountDownLatch/Participater.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Participater.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CountDownLatch; +package com.javaCore.java_thread.JUC.CountDownLatch; public class Participater implements Runnable{ private String name; diff --git a/src/main/java/com/javaCore/concurrency/CountDownLatch/Test.java b/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Test.java similarity index 88% rename from src/main/java/com/javaCore/concurrency/CountDownLatch/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Test.java index 8739480..c927a7e 100644 --- a/src/main/java/com/javaCore/concurrency/CountDownLatch/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CountDownLatch; +package com.javaCore.java_thread.JUC.CountDownLatch; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java b/src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_1.java similarity index 91% rename from src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java rename to src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_1.java index d7bc63c..3e022b0 100644 --- a/src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_1.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_1.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CyclicBarrier; +package com.javaCore.java_thread.JUC.CyclicBarrier; import java.util.concurrent.CyclicBarrier; diff --git a/src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java b/src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_2.java similarity index 93% rename from src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java rename to src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_2.java index fd354c4..95ee14d 100644 --- a/src/main/java/com/javaCore/concurrency/CyclicBarrier/CyclicBarrierTest_2.java +++ b/src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_2.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.CyclicBarrier; +package com.javaCore.java_thread.JUC.CyclicBarrier; import java.util.concurrent.CyclicBarrier; diff --git a/src/main/java/com/javaCore/concurrency/Exchanger/Consumer.java b/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Consumer.java similarity index 94% rename from src/main/java/com/javaCore/concurrency/Exchanger/Consumer.java rename to src/main/java/com/javaCore/java_thread/JUC/Exchanger/Consumer.java index 24c2b46..cd1b5c3 100644 --- a/src/main/java/com/javaCore/concurrency/Exchanger/Consumer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Consumer.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Exchanger; +package com.javaCore.java_thread.JUC.Exchanger; import java.util.List; import java.util.concurrent.Exchanger; diff --git a/src/main/java/com/javaCore/concurrency/Exchanger/Producer.java b/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Producer.java similarity index 96% rename from src/main/java/com/javaCore/concurrency/Exchanger/Producer.java rename to src/main/java/com/javaCore/java_thread/JUC/Exchanger/Producer.java index 21ed1ad..559efe6 100644 --- a/src/main/java/com/javaCore/concurrency/Exchanger/Producer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Producer.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Exchanger; +package com.javaCore.java_thread.JUC.Exchanger; import java.util.List; import java.util.concurrent.Exchanger; diff --git a/src/main/java/com/javaCore/concurrency/Exchanger/Test.java b/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Test.java similarity index 91% rename from src/main/java/com/javaCore/concurrency/Exchanger/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/Exchanger/Test.java index 4ff6bd8..cbacc6e 100644 --- a/src/main/java/com/javaCore/concurrency/Exchanger/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Exchanger; +package com.javaCore.java_thread.JUC.Exchanger; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_1.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_1.java similarity index 94% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_1.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_1.java index 10806fa..35eb665 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_1.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_1.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.util.concurrent.Phaser; diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_2.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_2.java similarity index 96% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_2.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_2.java index 17bf7dc..2f7e4a0 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_2.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_2.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_3.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_3.java similarity index 96% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_3.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_3.java index 5038fdd..c6720cf 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_3.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_3.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.util.concurrent.Phaser; diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_4.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_4.java similarity index 91% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_4.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_4.java index dba09c9..90002d3 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_4.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_4.java @@ -1,8 +1,8 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.util.concurrent.Phaser; -import com.javaCore.concurrency.Phaser.PhaserTest_3.Task_03; +import com.javaCore.java_thread.JUC.Phaser.PhaserTest_3.Task_03; public class PhaserTest_4 { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_5.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_5.java similarity index 95% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_5.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_5.java index 942771d..9bdb361 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_5.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_5.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.util.concurrent.Phaser; diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_6.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_6.java similarity index 97% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_6.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_6.java index 4446a75..ccb382b 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_6.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_6.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.util.concurrent.Phaser; diff --git a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_7.java b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_7.java similarity index 97% rename from src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_7.java rename to src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_7.java index d0b88f2..9d5cacf 100644 --- a/src/main/java/com/javaCore/concurrency/Phaser/PhaserTest_7.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_7.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Phaser; +package com.javaCore.java_thread.JUC.Phaser; import java.util.concurrent.Phaser; diff --git a/src/main/java/com/javaCore/concurrency/ReentrantLock/Job.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Job.java similarity index 82% rename from src/main/java/com/javaCore/concurrency/ReentrantLock/Job.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Job.java index 1205169..f49f917 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantLock/Job.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Job.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantLock; +package com.javaCore.java_thread.JUC.ReentrantLock; public class Job implements Runnable{ private PrintQueue printQueue; diff --git a/src/main/java/com/javaCore/concurrency/ReentrantLock/PrintQueue.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/PrintQueue.java similarity index 93% rename from src/main/java/com/javaCore/concurrency/ReentrantLock/PrintQueue.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/PrintQueue.java index 30a6abd..89ed925 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantLock/PrintQueue.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/PrintQueue.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantLock; +package com.javaCore.java_thread.JUC.ReentrantLock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; diff --git a/src/main/java/com/javaCore/concurrency/ReentrantLock/Test.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Test.java similarity index 85% rename from src/main/java/com/javaCore/concurrency/ReentrantLock/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Test.java index 03b42ab..b870039 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantLock/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantLock; +package com.javaCore.java_thread.JUC.ReentrantLock; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/PricesInfo.java similarity index 92% rename from src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/PricesInfo.java index c8fd3cc..2bb00d2 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/PricesInfo.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/PricesInfo.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; diff --git a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Reader.java similarity index 87% rename from src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Reader.java index bbe2719..31168cf 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Reader.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Reader.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; public class Reader implements Runnable{ diff --git a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Test.java similarity index 88% rename from src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Test.java index 995debf..1ec736e 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Writer.java similarity index 89% rename from src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java rename to src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Writer.java index 62b6317..8974b57 100644 --- a/src/main/java/com/javaCore/concurrency/ReentrantReadWriteLock/Writer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Writer.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; public class Writer implements Runnable{ private PricesInfo pricesInfo; diff --git a/src/main/java/com/javaCore/concurrency/Semaphore/Job.java b/src/main/java/com/javaCore/java_thread/JUC/Semaphore/Job.java similarity index 92% rename from src/main/java/com/javaCore/concurrency/Semaphore/Job.java rename to src/main/java/com/javaCore/java_thread/JUC/Semaphore/Job.java index 5960424..aa6f827 100644 --- a/src/main/java/com/javaCore/concurrency/Semaphore/Job.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Semaphore/Job.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Semaphore; +package com.javaCore.java_thread.JUC.Semaphore; /** * diff --git a/src/main/java/com/javaCore/concurrency/Semaphore/PrintQueue.java b/src/main/java/com/javaCore/java_thread/JUC/Semaphore/PrintQueue.java similarity index 94% rename from src/main/java/com/javaCore/concurrency/Semaphore/PrintQueue.java rename to src/main/java/com/javaCore/java_thread/JUC/Semaphore/PrintQueue.java index 830f0ca..7c48110 100644 --- a/src/main/java/com/javaCore/concurrency/Semaphore/PrintQueue.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Semaphore/PrintQueue.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Semaphore; +package com.javaCore.java_thread.JUC.Semaphore; import java.util.concurrent.Semaphore; diff --git a/src/main/java/com/javaCore/concurrency/Semaphore/Test.java b/src/main/java/com/javaCore/java_thread/JUC/Semaphore/Test.java similarity index 86% rename from src/main/java/com/javaCore/concurrency/Semaphore/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/Semaphore/Test.java index 47fc77e..1a396c1 100644 --- a/src/main/java/com/javaCore/concurrency/Semaphore/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Semaphore/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.Semaphore; +package com.javaCore.java_thread.JUC.Semaphore; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/concurrency/condition/Customer.java b/src/main/java/com/javaCore/java_thread/JUC/condition/Customer.java similarity index 82% rename from src/main/java/com/javaCore/concurrency/condition/Customer.java rename to src/main/java/com/javaCore/java_thread/JUC/condition/Customer.java index a3d5c10..640eaec 100644 --- a/src/main/java/com/javaCore/concurrency/condition/Customer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/condition/Customer.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.condition; +package com.javaCore.java_thread.JUC.condition; public class Customer { private Depot depot; diff --git a/src/main/java/com/javaCore/concurrency/condition/Depot.java b/src/main/java/com/javaCore/java_thread/JUC/condition/Depot.java similarity index 98% rename from src/main/java/com/javaCore/concurrency/condition/Depot.java rename to src/main/java/com/javaCore/java_thread/JUC/condition/Depot.java index 7080198..3529335 100644 --- a/src/main/java/com/javaCore/concurrency/condition/Depot.java +++ b/src/main/java/com/javaCore/java_thread/JUC/condition/Depot.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.condition; +package com.javaCore.java_thread.JUC.condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; diff --git a/src/main/java/com/javaCore/concurrency/condition/Producer.java b/src/main/java/com/javaCore/java_thread/JUC/condition/Producer.java similarity index 86% rename from src/main/java/com/javaCore/concurrency/condition/Producer.java rename to src/main/java/com/javaCore/java_thread/JUC/condition/Producer.java index 30ec7df..a00b7f9 100644 --- a/src/main/java/com/javaCore/concurrency/condition/Producer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/condition/Producer.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.condition; +package com.javaCore.java_thread.JUC.condition; public class Producer { private Depot depot; diff --git a/src/main/java/com/javaCore/concurrency/condition/Test.java b/src/main/java/com/javaCore/java_thread/JUC/condition/Test.java similarity index 87% rename from src/main/java/com/javaCore/concurrency/condition/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/condition/Test.java index 0b46f41..a663b5e 100644 --- a/src/main/java/com/javaCore/concurrency/condition/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/condition/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.condition; +package com.javaCore.java_thread.JUC.condition; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/concurrency/synchronize/Account.java b/src/main/java/com/javaCore/java_thread/JUC/synchronize/Account.java similarity index 92% rename from src/main/java/com/javaCore/concurrency/synchronize/Account.java rename to src/main/java/com/javaCore/java_thread/JUC/synchronize/Account.java index 7e3107d..3b89f98 100644 --- a/src/main/java/com/javaCore/concurrency/synchronize/Account.java +++ b/src/main/java/com/javaCore/java_thread/JUC/synchronize/Account.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.synchronize; +package com.javaCore.java_thread.JUC.synchronize; public class Account { diff --git a/src/main/java/com/javaCore/concurrency/synchronize/Bank.java b/src/main/java/com/javaCore/java_thread/JUC/synchronize/Bank.java similarity index 87% rename from src/main/java/com/javaCore/concurrency/synchronize/Bank.java rename to src/main/java/com/javaCore/java_thread/JUC/synchronize/Bank.java index 15ccaf3..38263f0 100644 --- a/src/main/java/com/javaCore/concurrency/synchronize/Bank.java +++ b/src/main/java/com/javaCore/java_thread/JUC/synchronize/Bank.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.synchronize; +package com.javaCore.java_thread.JUC.synchronize; public class Bank implements Runnable{ diff --git a/src/main/java/com/javaCore/concurrency/synchronize/Company.java b/src/main/java/com/javaCore/java_thread/JUC/synchronize/Company.java similarity index 87% rename from src/main/java/com/javaCore/concurrency/synchronize/Company.java rename to src/main/java/com/javaCore/java_thread/JUC/synchronize/Company.java index 5b15c31..a7a47df 100644 --- a/src/main/java/com/javaCore/concurrency/synchronize/Company.java +++ b/src/main/java/com/javaCore/java_thread/JUC/synchronize/Company.java @@ -1,4 +1,4 @@ -package com.javaCore.concurrency.synchronize; +package com.javaCore.java_thread.JUC.synchronize; public class Company implements Runnable{ diff --git a/src/main/java/com/javaCore/java_thread/basic/MultiThread.java b/src/main/java/com/javaCore/java_thread/basic/MultiThread.java new file mode 100644 index 0000000..2645860 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/basic/MultiThread.java @@ -0,0 +1,26 @@ +package com.javaCore.java_thread.basic; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; + +/** + * java线程管理
    + * ThreadMXBean : Java 虚拟机线程系统的管理接口
    + * ThreadInfo : 线程信息 + * + * @author:chenssy + * @date : 2016年8月8日 8:42 + */ +public class MultiThread { + public static void main(String[] args){ + //获取java线程管理的Bean + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + //不需要获取同步的monitor和synchronizer信息,仅获取线程和线程的堆栈信息 + ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false); + + for(ThreadInfo info : threadInfos){ + System.out.println("[" + info.getThreadId() + "] :" + info.getThreadName()); + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/basic/ThreadState.java b/src/main/java/com/javaCore/java_thread/basic/ThreadState.java new file mode 100644 index 0000000..fae12f7 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/basic/ThreadState.java @@ -0,0 +1,65 @@ +package com.javaCore.java_thread.basic; + +import java.util.concurrent.TimeUnit; + +/** + * 深入理解线程状态 + * + * @author:chenssy + * @date : 2016年8月8日 9:02 + */ +public class ThreadState { + + + public static void main(String args[]){ + new Thread(new TimeWaiting(),"TimeWaitingTread").start(); + new Thread(new Waiting(),"WaitingThread").start(); + new Thread(new Blocked(),"BlockedThread-1").start(); + new Thread(new Blocked(),"BlockedThread-2").start(); + } + + static class TimeWaiting implements Runnable{ + @Override + public void run() { + while(true){ + SleepUtils.second(100); + } + } + } + + static class Waiting implements Runnable{ + @Override + public void run() { + while(true){ + synchronized (Waiting.class){ + try { + Waiting.class.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + } + + static class Blocked implements Runnable{ + @Override + public void run() { + synchronized (Blocked.class){ + while (true){ + SleepUtils.second(100); + } + } + } + } + + static class SleepUtils{ + static final void second(long seconds){ + try { + TimeUnit.SECONDS.sleep(seconds); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} From e9d6f0e55ffcabe6b432c08a781d52dd376e4559 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年8月16日 09:20:45 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=AD=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 252 ++++++++---------- .../java_thread/basic/InterruptedThread.java | 60 +++++ .../java_thread/basic/ShutDownThread.java | 48 ++++ 3 files changed, 213 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/javaCore/java_thread/basic/InterruptedThread.java create mode 100644 src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 688a82c..a88dd62 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,42 +3,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -64,24 +28,26 @@ - - + + - - - - - + + + - - + + - - - + + + + + + + @@ -102,6 +68,8 @@ @@ -156,8 +124,6 @@ - - @@ -263,48 +229,6 @@ - - - - - - - - - - - - - - - - - - - @@ -342,6 +266,8 @@ + +
    @@ -361,6 +287,9 @@ + + + @@ -368,7 +297,7 @@ - + @@ -413,6 +342,50 @@ + + + + + + + + + + + + @@ -656,32 +629,6 @@ - - - - - - @@ -704,16 +651,19 @@ - + - - - + + + + - - - + + + + + @@ -728,16 +678,17 @@ - - - + + @@ -756,7 +707,7 @@ - + @@ -829,7 +780,6 @@ - @@ -837,7 +787,6 @@ - @@ -845,7 +794,6 @@ - @@ -853,7 +801,6 @@ - @@ -869,10 +816,6 @@ - - - - @@ -880,28 +823,43 @@ - + + + + + + + - + - - - - + - - + + + + + + + + + + + + + + diff --git a/src/main/java/com/javaCore/java_thread/basic/InterruptedThread.java b/src/main/java/com/javaCore/java_thread/basic/InterruptedThread.java new file mode 100644 index 0000000..f1a31dd --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/basic/InterruptedThread.java @@ -0,0 +1,60 @@ +package com.javaCore.java_thread.basic; + +import java.util.concurrent.TimeUnit; + +/** + * 线程中断测试
    + * 线程A不停地休眠,线程B一直运行,然后进行中断操作,观察两个线程的中断标识
    + * + *InterruptedException:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常 + * + * @author:chenssy + * @date : 2016年8月16日 8:44 + */ +public class InterruptedThread { + static class SleepThread implements Runnable{ + @Override + public void run() { + while(true){ + try { + TimeUnit.SECONDS.sleep(10); //不停地休眠 + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + static class BusyThread implements Runnable{ + @Override + public void run() { + while(true){ + //一直运行 + } + } + } + + + public static void main(String[] args) throws InterruptedException { + Thread sleepThread = new Thread(new SleepThread(),"SleepThread"); + Thread busyThread = new Thread(new BusyThread(),"BusyThread"); + + busyThread.setDaemon(true); //设置为Daemon模式 + sleepThread.start(); + busyThread.start(); + + //休眠五秒,两个线程充分运行 + TimeUnit.SECONDS.sleep(5); + + //终止线程 + sleepThread.interrupt(); + busyThread.interrupt(); + + //观看终止状态 + System.out.println("SleepThread interrupted is " + sleepThread.isInterrupted()); + System.out.println("BusyThread interrupted is " + busyThread.isInterrupted()); + + //防止主线程终止,导致两个线程立即退出 + TimeUnit.SECONDS.sleep(10); + } +} diff --git a/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java b/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java new file mode 100644 index 0000000..2e7e5b1 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java @@ -0,0 +1,48 @@ +package com.javaCore.java_thread.basic; + +import com.sun.java.accessibility.util.TopLevelWindowListener; +import com.sun.xml.internal.ws.util.Pool; + +import java.util.concurrent.TimeUnit; + +/** + * 安全有效地终止线程 + * + * @author:chenssy + * @date : 2016年8月16日 8:57 + */ +public class ShutDownThread { + static class Runner implements Runnable{ + private long i ; + private volatile boolean on = true; + @Override + public void run() { + while(on && !Thread.currentThread().isInterrupted()){ + i++; + } + System.out.println("Count i = " + i); + } + + public void cancle(){ + on = false; + } + } + + public static void main(String[] args) throws InterruptedException { + Runner one = new Runner(); + Thread countThread = new Thread(one,"CountThread"); + countThread.start(); + + //休眠1秒,main线程对CountThread进行中断,使CountThread能够感知中断而结束 + TimeUnit.SECONDS.sleep(1); + countThread.interrupt(); + + Runner two = new Runner(); + countThread = new Thread(two,"CountThread"); + countThread.start(); + + //休眠1秒,main线程对Ruuner two 进行取消,使得CountThread能够感知on为false而结束 + TimeUnit.SECONDS.sleep(1); + two.cancle(); + } +} From 8f0007a28865f3ee634a2b851a2c11dd47702d9b Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Tue, 9 Aug 2016 13:10:53 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0wait/notify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 +- .idea/.name | 1 - .idea/compiler.xml | 33 - .idea/copyright/profiles_settings.xml | 3 - .idea/encodings.xml | 4 - .idea/libraries/Maven__junit_junit_3_8_1.xml | 13 - .idea/libraries/Maven__junit_junit_4_11.xml | 13 - .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 - .idea/misc.xml | 176 ---- .idea/modules.xml | 8 - .idea/scopes/scope_settings.xml | 5 - .idea/uiDesigner.xml | 124 --- .idea/vcs.xml | 6 - .idea/workspace.xml | 952 ------------------ JavaCore.iml | 17 - .../java_thread/basic/ShutDownThread.java | 2 + .../java_thread/basic/WaitAndNotify.java | 66 ++ 17 files changed, 71 insertions(+), 1372 deletions(-) delete mode 100644 .idea/.name delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/libraries/Maven__junit_junit_3_8_1.xml delete mode 100644 .idea/libraries/Maven__junit_junit_4_11.xml delete mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/scopes/scope_settings.xml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml delete mode 100644 JavaCore.iml create mode 100644 src/main/java/com/javaCore/java_thread/basic/WaitAndNotify.java diff --git a/.gitignore b/.gitignore index 23fed15..c45676f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ -/target/ +target/ -.idea/ -*.iml -target/ \ No newline at end of file +.idea +*.iml \ No newline at end of file diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 8b1f01b..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -JavaCore \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index ab856f2..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index d821048..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_3_8_1.xml b/.idea/libraries/Maven__junit_junit_3_8_1.xml deleted file mode 100644 index 71b2993..0000000 --- a/.idea/libraries/Maven__junit_junit_3_8_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_11.xml b/.idea/libraries/Maven__junit_junit_4_11.xml deleted file mode 100644 index f33320d..0000000 --- a/.idea/libraries/Maven__junit_junit_4_11.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml deleted file mode 100644 index f58bbc1..0000000 --- a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 3057019..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7 - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index fe9ef32..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml deleted file mode 100644 index 922003b..0000000 --- a/.idea/scopes/scope_settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index e96534f..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - -
      - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index a88dd62..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,952 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1470272484036 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No facets are configured - - - - - - - - - - - - - - - 1.7 - - - - - - - - JavaCore - - - - - - - - 1.7 - - - - - - - - Maven: junit:junit:3.8.1 - - - - - - - - \ No newline at end of file diff --git a/JavaCore.iml b/JavaCore.iml deleted file mode 100644 index 0672cbc..0000000 --- a/JavaCore.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java b/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java index 2e7e5b1..6b6ecf8 100644 --- a/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java +++ b/src/main/java/com/javaCore/java_thread/basic/ShutDownThread.java @@ -45,4 +45,6 @@ public static void main(String[] args) throws InterruptedException { TimeUnit.SECONDS.sleep(1); two.cancle(); } + + } diff --git a/src/main/java/com/javaCore/java_thread/basic/WaitAndNotify.java b/src/main/java/com/javaCore/java_thread/basic/WaitAndNotify.java new file mode 100644 index 0000000..75f45ba --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/basic/WaitAndNotify.java @@ -0,0 +1,66 @@ +package com.javaCore.java_thread.basic; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +/** + * ${todo} + * + * @author:chenssy + * @date : 2016年8月9日 13:00 + */ +public class WaitAndNotify { + static boolean flag = true; + static Object lock = new Object(); + static class WaitThread implements Runnable{ + @Override + public void run() { + synchronized (lock){ + while (flag){ + System.out.println(Thread.currentThread() + "flag is true . wait @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); + try { + lock.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println(Thread.currentThread() + "flag is false . wait @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); + } + } + } + + static class NotifyThread implements Runnable{ + @Override + public void run() { + synchronized (lock){ + System.out.println(Thread.currentThread() + "hold lock. notify @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); + lock.notifyAll(); + flag = false; + + try { + TimeUnit.SECONDS.sleep(5); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + synchronized (lock){ + System.out.println(Thread.currentThread() + "hold lock again . notify @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); + try { + TimeUnit.SECONDS.sleep(5); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args){ + Thread waitThread = new Thread(new WaitThread(),"waitThread"); + waitThread.start(); + + Thread notifyThread = new Thread(new NotifyThread(),"notifyThread"); + notifyThread.start(); + } +} From 1e183ca0bc2fbd51c0bcbf36cfc511c8e256f59d Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年8月10日 20:59:03 +0800 Subject: [PATCH 06/25] add thread join --- .../java_thread/basic/JoinThread.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/javaCore/java_thread/basic/JoinThread.java diff --git a/src/main/java/com/javaCore/java_thread/basic/JoinThread.java b/src/main/java/com/javaCore/java_thread/basic/JoinThread.java new file mode 100644 index 0000000..26bffc8 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/basic/JoinThread.java @@ -0,0 +1,43 @@ +package com.javaCore.java_thread.basic; + +import java.util.concurrent.TimeUnit; + +/** + * Thread.join() + * + * @author:chenssy + * @date : 2016年8月10日 8:54 + */ +public class JoinThread { + static class Domino implements Runnable{ + private Thread thread; + + Domino(Thread thread){ + this.thread = thread; + } + + @Override + public void run() { + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(Thread.currentThread().getName() + " terminate"); + } + } + + public static void main(String[] args) throws InterruptedException { + Thread previous = Thread.currentThread(); + + for(int i = 0 ; i < 10 ; i++){ + Thread thread = new Thread(new Domino(previous),String.valueOf(i)); + thread.start(); + + previous = thread; + } + + TimeUnit.SECONDS.sleep(5); + System.out.println(Thread.currentThread().getName() + " terminate"); + } +} From 6dbccc786339c5834e22cf6bcfe5a85be4cdb7ac Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2017年3月27日 19:21:16 +0800 Subject: [PATCH 07/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java_thread/JUC/Lock/AQS/Mutex.java | 78 ++++++++++++++++++ .../JUC/Lock/AQS/twinsLock/TwinsLock.java | 80 +++++++++++++++++++ .../JUC/Lock/AQS/twinsLock/TwinsLockTest.java | 45 +++++++++++ .../ReentrantLock/_1}/Job.java | 2 +- .../ReentrantLock/_1}/PrintQueue.java | 2 +- .../ReentrantLock/_1}/Test.java | 2 +- .../ReentrantReadWriteLock/PricesInfo.java | 2 +- .../ReentrantReadWriteLock/Reader.java | 2 +- .../ReentrantReadWriteLock/Test.java | 2 +- .../ReentrantReadWriteLock/Writer.java | 2 +- .../ConcurrentHashMapTest.java | 2 +- .../CopyOnWriteArrayListTest.java | 2 +- .../CopyOnWriteArraySetTest.java | 2 +- 13 files changed, 213 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/Mutex.java create mode 100644 src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLock.java create mode 100644 src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLockTest.java rename src/main/java/com/javaCore/java_thread/JUC/{ReentrantLock => Lock/ReentrantLock/_1}/Job.java (80%) rename src/main/java/com/javaCore/java_thread/JUC/{ReentrantLock => Lock/ReentrantLock/_1}/PrintQueue.java (92%) rename src/main/java/com/javaCore/java_thread/JUC/{ReentrantLock => Lock/ReentrantLock/_1}/Test.java (83%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/ReentrantReadWriteLock/PricesInfo.java (91%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/ReentrantReadWriteLock/Reader.java (86%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/ReentrantReadWriteLock/Test.java (87%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/ReentrantReadWriteLock/Writer.java (88%) rename src/main/java/com/javaCore/java_thread/JUC/{ => concurrentCollection}/ConcurrentHashMap/ConcurrentHashMapTest.java (69%) rename src/main/java/com/javaCore/java_thread/JUC/{ => concurrentCollection}/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java (90%) rename src/main/java/com/javaCore/java_thread/JUC/{ => concurrentCollection}/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java (90%) diff --git a/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/Mutex.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/Mutex.java new file mode 100644 index 0000000..765bec0 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/Mutex.java @@ -0,0 +1,78 @@ +package com.javaCore.java_thread.JUC.Lock.AQS; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; + +/** + * 自定义独占锁
      + * + * @author:chenssy + * @date : 2016年10月8日 8:42 + */ +public class Mutex implements Lock{ + + private static class MySync extends AbstractQueuedSynchronizer{ + protected boolean isHeldExclusively(){ + return getState()>= 1; + } + + protected boolean tryAcquire(int acquires){ + if(compareAndSetState(0,acquires)){ + setExclusiveOwnerThread(Thread.currentThread()); + return true; + } + return false; + } + + protected boolean tryRelease(int releases){ + if(getState() == 0){ + throw new IllegalMonitorStateException(); + } + + setExclusiveOwnerThread(null); + setState(0); + return true; + } + + protected Condition newCondition(){ + return new ConditionObject(); + } + } + + /* + * 下面的方法直接使用sync代理即可 + */ + private final MySync sync = new MySync(); + + @Override + public void lock() { + sync.acquire(1); + } + + @Override + public void lockInterruptibly() throws InterruptedException { + sync.acquireInterruptibly(1); + } + + @Override + public boolean tryLock() { + return sync.tryAcquire(1); + } + + @Override + public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { + return sync.tryAcquireNanos(1,unit.toNanos(time)); + } + + @Override + public void unlock() { + sync.tryRelease(1); + } + + @Override + public Condition newCondition() { + return sync.newCondition(); + } +} diff --git a/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLock.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLock.java new file mode 100644 index 0000000..a1ae12a --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLock.java @@ -0,0 +1,80 @@ +package com.javaCore.java_thread.JUC.Lock.AQS.twinsLock; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; + +/** + * ${todo} + * + * @author:chenssy + * @date : 2016年10月14日 9:21 + */ +public class TwinsLock implements Lock{ + + private class TwinsSync extends AbstractQueuedSynchronizer{ + public TwinsSync(int count){ + if(count < 0){ + throw new IllegalArgumentException("Count must large than zero."); + } + setState(count); + } + + @Override + protected int tryAcquireShared(int reduceCount) { + for(;;){ + int current = getState(); + int newCount = current - reduceCount; + if(newCount < 0 || compareAndSetState(current,newCount)){ + return newCount; + } + } + } + + @Override + protected boolean tryReleaseShared(int arg) { + for(;;){ + int current = getState(); + int newCount = current - arg; + if(newCount <0 || compareAndSetState(current,newCount)){ + return true; + } + } + + } + } + + private final TwinsSync sync = new TwinsSync(2); + + @Override + public void lock() { + sync.acquireShared(1); + } + + @Override + public void lockInterruptibly() throws InterruptedException { + //doSomething + } + + @Override + public boolean tryLock() { + return false; + } + + @Override + public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { + return false; + } + + @Override + public void unlock() { + sync.tryReleaseShared(1); + } + + @Override + public Condition newCondition() { + return null; + } + +} diff --git a/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLockTest.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLockTest.java new file mode 100644 index 0000000..d5cfead --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/AQS/twinsLock/TwinsLockTest.java @@ -0,0 +1,45 @@ +package com.javaCore.java_thread.JUC.Lock.AQS.twinsLock; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; + +/** + * ${todo} + * + * @author:chenssy + * @date : 2016/10/14 10:44 + */ +public class TwinsLockTest { + public static void main(String args[]) throws InterruptedException { + final Lock lock = new TwinsLock(); + + class Work extends Thread{ + @Override + public void run() { + lock.lock(); + + try { + TimeUnit.SECONDS.sleep(1); + System.out.println(Thread.currentThread().getName()); + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + lock.unlock(); + } + } + } + + for(int i = 0 ; i < 10 ; i++){ + Work work = new Work(); + work.setDaemon(true); + work.start(); + } + + for(int i = 0 ; i < 10 ; i++){ + TimeUnit.SECONDS.sleep(1); + //应该是成对输出!! + System.out.println(""); + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Job.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/Job.java similarity index 80% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Job.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/Job.java index f49f917..4a88192 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Job.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/Job.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantLock._1; public class Job implements Runnable{ private PrintQueue printQueue; diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/PrintQueue.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/PrintQueue.java similarity index 92% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/PrintQueue.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/PrintQueue.java index 89ed925..95bdc56 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/PrintQueue.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/PrintQueue.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantLock._1; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Test.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/Test.java similarity index 83% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/Test.java index b870039..dc8243b 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantLock/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantLock/_1/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantLock._1; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/PricesInfo.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/PricesInfo.java similarity index 91% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/PricesInfo.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/PricesInfo.java index 2bb00d2..2ee09dc 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/PricesInfo.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/PricesInfo.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantReadWriteLock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Reader.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Reader.java similarity index 86% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Reader.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Reader.java index 31168cf..29358a5 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Reader.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Reader.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantReadWriteLock; public class Reader implements Runnable{ diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Test.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Test.java similarity index 87% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Test.java index 1ec736e..4992e24 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantReadWriteLock; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Writer.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Writer.java similarity index 88% rename from src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Writer.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Writer.java index 8974b57..2079e0f 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ReentrantReadWriteLock/Writer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/ReentrantReadWriteLock/Writer.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ReentrantReadWriteLock; +package com.javaCore.java_thread.JUC.Lock.ReentrantReadWriteLock; public class Writer implements Runnable{ private PricesInfo pricesInfo; diff --git a/src/main/java/com/javaCore/java_thread/JUC/ConcurrentHashMap/ConcurrentHashMapTest.java b/src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/ConcurrentHashMap/ConcurrentHashMapTest.java similarity index 69% rename from src/main/java/com/javaCore/java_thread/JUC/ConcurrentHashMap/ConcurrentHashMapTest.java rename to src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/ConcurrentHashMap/ConcurrentHashMapTest.java index ba8a57b..e667d12 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ConcurrentHashMap/ConcurrentHashMapTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/ConcurrentHashMap/ConcurrentHashMapTest.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.ConcurrentHashMap; +package com.javaCore.java_thread.JUC.concurrentCollection.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java b/src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java similarity index 90% rename from src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java rename to src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java index 8a3d324..871678c 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/CopyOnWriteArrayList/CopyOnWriteArrayListTest.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.CopyOnWriteArrayList; +package com.javaCore.java_thread.JUC.concurrentCollection.CopyOnWriteArrayList; import java.util.Iterator; import java.util.List; diff --git a/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java b/src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java similarity index 90% rename from src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java rename to src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java index 5d81bbc..48bab97 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/concurrentCollection/CopyOnWriteArraySet/CopyOnWriteArraySetTest.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.CopyOnWriteArraySet; +package com.javaCore.java_thread.JUC.concurrentCollection.CopyOnWriteArraySet; import java.util.Iterator; import java.util.Set; From f1735fb0c9eddef200e17618237fded621649c3e Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2017年3月28日 09:37:52 +0800 Subject: [PATCH 08/25] add atomic --- .../JUC/Atomic/AtomicIntegerArrayTest.java | 26 +++++++++++ .../JUC/Atomic/AtomicIntegerTest.java | 25 ++++++++++ .../JUC/Atomic/AtomicReferenceTest.java | 46 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerArrayTest.java create mode 100644 src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerTest.java create mode 100644 src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerArrayTest.java b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerArrayTest.java new file mode 100644 index 0000000..7e15b35 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerArrayTest.java @@ -0,0 +1,26 @@ +package com.javaCore.java_thread.JUC.Atomic; + +import java.util.concurrent.atomic.AtomicIntegerArray; + +/** + * AtomicIntegerArrayTest + * + * @author:chenssy + * @date : 2017年3月28日 9:11 + */ +public class AtomicIntegerArrayTest{ + private static int[] value = new int[]{1,2,3,4,5}; + + private static AtomicIntegerArray aia = new AtomicIntegerArray(value); + + public static void main(String[] args){ + aia.addAndGet(2,10); //第三个元素 + 10 + System.out.println(aia.get(2)); + + //内部进行复制,不会影响原本value + aia.set(1,0); + System.out.println(value[0]); + System.out.println(aia.get(1)); + } + +} diff --git a/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerTest.java b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerTest.java new file mode 100644 index 0000000..b1d4649 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicIntegerTest.java @@ -0,0 +1,25 @@ +package com.javaCore.java_thread.JUC.Atomic; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * AtomicInteger
      + * + * addAndGet:以原子方式将输入的值与实例的值相加并返回结果
      + * getAndIncrement:以原子方式将当前值加1,返回的自增之前的值
      + * lazySet:最终会设置成newValue,使用lazySet设置值后,可能会导致其他线程在之后的一小段时间内还是可以读到旧值
      + * getAndSet:以原子方式设置为newValue,返回oldValue
      + * + * @author:chenssy + * @date : 2017年3月28日 8:56 + */ +public class AtomicIntegerTest { + private static AtomicInteger ai = new AtomicInteger(1); + + public static void main(String[] args){ + System.out.println(ai.getAndIncrement()); + System.out.println(ai.getAndSet(999)); + System.out.println(ai.get()); + } + +} diff --git a/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java new file mode 100644 index 0000000..52f8299 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java @@ -0,0 +1,46 @@ +package com.javaCore.java_thread.JUC.Atomic; + +import java.util.concurrent.atomic.AtomicReference; + +/** + * AtomicReferenceTest + * + * @author:chenssy + * @date : 2017年3月28日 9:25 + */ +public class AtomicReferenceTest { + private static class User{ + private String name; + private int old; + + public User(String name, int old) { + this.name = name; + this.old = old; + } + + public int getOld() { + return old; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "{name: " + getName() + ",old:"+getOld()+"}"; + } + } + + private static AtomicReference atomicReference = new AtomicReference(); + + public static void main(String[] args){ + User user = new User("chenssy",18); + atomicReference.set(user); + System.out.println(atomicReference.get().toString()); + User updateUser = new User("CHENSSY",22); + atomicReference.compareAndSet(user,updateUser); + System.out.println(atomicReference.get().toString()); + } + +} From 10c5db9493d33a57f896c09ec91458ddc89d36c6 Mon Sep 17 00:00:00 2001 From: chenssy Date: 2016年8月18日 21:22:20 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JUC/{ => ThreadUtils}/CountDownLatch/Conference.java | 0 .../JUC/{ => ThreadUtils}/CountDownLatch/Participater.java | 0 .../java_thread/JUC/{ => ThreadUtils}/CountDownLatch/Test.java | 0 .../JUC/{ => ThreadUtils}/CyclicBarrier/CyclicBarrierTest_1.java | 0 .../JUC/{ => ThreadUtils}/CyclicBarrier/CyclicBarrierTest_2.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_1.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_2.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_3.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_4.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_5.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_6.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_7.java | 0 .../javaCore/java_thread/JUC/{ => ThreadUtils}/Semaphore/Job.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Semaphore/PrintQueue.java | 0 .../java_thread/JUC/{ => ThreadUtils}/Semaphore/Test.java | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/CountDownLatch/Conference.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/CountDownLatch/Participater.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/CountDownLatch/Test.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/CyclicBarrier/CyclicBarrierTest_1.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/CyclicBarrier/CyclicBarrierTest_2.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_1.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_2.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_3.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_4.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_5.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_6.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Phaser/PhaserTest_7.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Semaphore/Job.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Semaphore/PrintQueue.java (100%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Semaphore/Test.java (100%) diff --git a/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Conference.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CountDownLatch/Conference.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Conference.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CountDownLatch/Conference.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Participater.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CountDownLatch/Participater.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Participater.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CountDownLatch/Participater.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Test.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CountDownLatch/Test.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/CountDownLatch/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CountDownLatch/Test.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_1.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CyclicBarrier/CyclicBarrierTest_1.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_1.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CyclicBarrier/CyclicBarrierTest_1.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_2.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CyclicBarrier/CyclicBarrierTest_2.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/CyclicBarrier/CyclicBarrierTest_2.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/CyclicBarrier/CyclicBarrierTest_2.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_1.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_1.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_1.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_1.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_2.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_2.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_2.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_2.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_3.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_3.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_3.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_3.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_4.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_4.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_4.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_4.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_5.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_5.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_5.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_5.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_6.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_6.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_6.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_6.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_7.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_7.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Phaser/PhaserTest_7.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Phaser/PhaserTest_7.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Semaphore/Job.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Semaphore/Job.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Semaphore/Job.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Semaphore/Job.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Semaphore/PrintQueue.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Semaphore/PrintQueue.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Semaphore/PrintQueue.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Semaphore/PrintQueue.java diff --git a/src/main/java/com/javaCore/java_thread/JUC/Semaphore/Test.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Semaphore/Test.java similarity index 100% rename from src/main/java/com/javaCore/java_thread/JUC/Semaphore/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Semaphore/Test.java From f88d5d0addf964b035dab3807a575bf8976d2d14 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年8月22日 12:51:40 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaCore/java_thread/JUC/{ => Lock}/condition/Customer.java | 2 +- .../javaCore/java_thread/JUC/{ => Lock}/condition/Depot.java | 2 +- .../javaCore/java_thread/JUC/{ => Lock}/condition/Producer.java | 2 +- .../com/javaCore/java_thread/JUC/{ => Lock}/condition/Test.java | 2 +- .../java_thread/JUC/{ => ThreadUtils}/Exchanger/Consumer.java | 2 +- .../java_thread/JUC/{ => ThreadUtils}/Exchanger/Producer.java | 2 +- .../java_thread/JUC/{ => ThreadUtils}/Exchanger/Test.java | 2 +- .../java_thread/{JUC => basic}/synchronize/Account.java | 2 +- .../javaCore/java_thread/{JUC => basic}/synchronize/Bank.java | 2 +- .../java_thread/{JUC => basic}/synchronize/Company.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/condition/Customer.java (81%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/condition/Depot.java (98%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/condition/Producer.java (84%) rename src/main/java/com/javaCore/java_thread/JUC/{ => Lock}/condition/Test.java (86%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Exchanger/Consumer.java (93%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Exchanger/Producer.java (95%) rename src/main/java/com/javaCore/java_thread/JUC/{ => ThreadUtils}/Exchanger/Test.java (90%) rename src/main/java/com/javaCore/java_thread/{JUC => basic}/synchronize/Account.java (92%) rename src/main/java/com/javaCore/java_thread/{JUC => basic}/synchronize/Bank.java (87%) rename src/main/java/com/javaCore/java_thread/{JUC => basic}/synchronize/Company.java (86%) diff --git a/src/main/java/com/javaCore/java_thread/JUC/condition/Customer.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Customer.java similarity index 81% rename from src/main/java/com/javaCore/java_thread/JUC/condition/Customer.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Customer.java index 640eaec..190d45a 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/condition/Customer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Customer.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.condition; +package com.javaCore.java_thread.JUC.Lock.condition; public class Customer { private Depot depot; diff --git a/src/main/java/com/javaCore/java_thread/JUC/condition/Depot.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Depot.java similarity index 98% rename from src/main/java/com/javaCore/java_thread/JUC/condition/Depot.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Depot.java index 3529335..a9be243 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/condition/Depot.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Depot.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.condition; +package com.javaCore.java_thread.JUC.Lock.condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; diff --git a/src/main/java/com/javaCore/java_thread/JUC/condition/Producer.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Producer.java similarity index 84% rename from src/main/java/com/javaCore/java_thread/JUC/condition/Producer.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Producer.java index a00b7f9..c68b04b 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/condition/Producer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Producer.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.condition; +package com.javaCore.java_thread.JUC.Lock.condition; public class Producer { private Depot depot; diff --git a/src/main/java/com/javaCore/java_thread/JUC/condition/Test.java b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Test.java similarity index 86% rename from src/main/java/com/javaCore/java_thread/JUC/condition/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Test.java index a663b5e..1817e53 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/condition/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Lock/condition/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.condition; +package com.javaCore.java_thread.JUC.Lock.condition; public class Test { public static void main(String[] args) { diff --git a/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Consumer.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Consumer.java similarity index 93% rename from src/main/java/com/javaCore/java_thread/JUC/Exchanger/Consumer.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Consumer.java index cd1b5c3..5bcdcd2 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Consumer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Consumer.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.Exchanger; +package com.javaCore.java_thread.JUC.ThreadUtils.Exchanger; import java.util.List; import java.util.concurrent.Exchanger; diff --git a/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Producer.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Producer.java similarity index 95% rename from src/main/java/com/javaCore/java_thread/JUC/Exchanger/Producer.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Producer.java index 559efe6..80e2f8d 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Producer.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Producer.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.Exchanger; +package com.javaCore.java_thread.JUC.ThreadUtils.Exchanger; import java.util.List; import java.util.concurrent.Exchanger; diff --git a/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Test.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java similarity index 90% rename from src/main/java/com/javaCore/java_thread/JUC/Exchanger/Test.java rename to src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java index cbacc6e..6a2aa21 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/Exchanger/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.Exchanger; +package com.javaCore.java_thread.JUC.ThreadUtils.Exchanger; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/javaCore/java_thread/JUC/synchronize/Account.java b/src/main/java/com/javaCore/java_thread/basic/synchronize/Account.java similarity index 92% rename from src/main/java/com/javaCore/java_thread/JUC/synchronize/Account.java rename to src/main/java/com/javaCore/java_thread/basic/synchronize/Account.java index 3b89f98..18c0470 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/synchronize/Account.java +++ b/src/main/java/com/javaCore/java_thread/basic/synchronize/Account.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.synchronize; +package com.javaCore.java_thread.basic.synchronize; public class Account { diff --git a/src/main/java/com/javaCore/java_thread/JUC/synchronize/Bank.java b/src/main/java/com/javaCore/java_thread/basic/synchronize/Bank.java similarity index 87% rename from src/main/java/com/javaCore/java_thread/JUC/synchronize/Bank.java rename to src/main/java/com/javaCore/java_thread/basic/synchronize/Bank.java index 38263f0..bd3c76c 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/synchronize/Bank.java +++ b/src/main/java/com/javaCore/java_thread/basic/synchronize/Bank.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.synchronize; +package com.javaCore.java_thread.basic.synchronize; public class Bank implements Runnable{ diff --git a/src/main/java/com/javaCore/java_thread/JUC/synchronize/Company.java b/src/main/java/com/javaCore/java_thread/basic/synchronize/Company.java similarity index 86% rename from src/main/java/com/javaCore/java_thread/JUC/synchronize/Company.java rename to src/main/java/com/javaCore/java_thread/basic/synchronize/Company.java index a7a47df..f0ee8c6 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/synchronize/Company.java +++ b/src/main/java/com/javaCore/java_thread/basic/synchronize/Company.java @@ -1,4 +1,4 @@ -package com.javaCore.java_thread.JUC.synchronize; +package com.javaCore.java_thread.basic.synchronize; public class Company implements Runnable{ From 26eff3e19d28b51c95db31353405e37d20570083 Mon Sep 17 00:00:00 2001 From: chenssy Date: 2016年10月26日 22:43:05 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E7=9A=84=20Master-worker=E3=80=81Guarded=20Suspension=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/GuardedSuspension/ClientThread.java | 33 ++++++++ .../model/GuardedSuspension/Request.java | 18 +++++ .../model/GuardedSuspension/RequestQueue.java | 31 +++++++ .../model/GuardedSuspension/ServerThread.java | 28 +++++++ .../model/GuardedSuspension/Test.java | 21 +++++ .../model/MasterWorker/Master.java | 80 +++++++++++++++++++ .../model/MasterWorker/PlusWorker.java | 13 +++ .../java_thread/model/MasterWorker/Test.java | 48 +++++++++++ .../model/MasterWorker/Worker.java | 48 +++++++++++ 9 files changed, 320 insertions(+) create mode 100644 src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java create mode 100644 src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java create mode 100644 src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java create mode 100644 src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java create mode 100644 src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java create mode 100644 src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java create mode 100644 src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java create mode 100644 src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java create mode 100644 src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java new file mode 100644 index 0000000..ed885aa --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java @@ -0,0 +1,33 @@ +package main.java.com.javaCore.java_thread.model.GuardedSuspension; + +/** + * @Author: chenssy + * @Date: 2016年10月26日 22:30 + */ +public class ClientThread extends Thread{ + private RequestQueue requestQueue; + + public ClientThread(RequestQueue requestQueue ,String name){ + super(name); + this.requestQueue = requestQueue; + } + + @Override + public void run() { + for(int i = 0 ; i < 10 ; i++){ + Request request = new Request("RequestId:" + i + "ThreadName:" + Thread.currentThread().getName()); + System.out.println(Thread.currentThread().getName() + " request " + request); + + requestQueue.addRequest(request); //提交请求 + + try { + Thread.sleep(100); //客户端请求速度快于服务端处理速度 + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("ClientThread name is "+Thread.currentThread().getName()); + } + + System.out.println(Thread.currentThread().getName() + "request end"); + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java new file mode 100644 index 0000000..9bcfbbd --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java @@ -0,0 +1,18 @@ +package main.java.com.javaCore.java_thread.model.GuardedSuspension; + +/** + * @Author: chenssy + * @Date: 2016/10/26 22:13 + */ +public class Request { + private String name; + + public Request(String name){ + this.name = name; + } + + @Override + public String toString() { + return "[Request " + name + "]"; + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java new file mode 100644 index 0000000..206016c --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java @@ -0,0 +1,31 @@ +package main.java.com.javaCore.java_thread.model.GuardedSuspension; + +import java.util.LinkedList; +import java.util.List; + +/** + * 维护Request请求信息 + * + * @Author: chenssy + * @Date: 2016/10/26 22:23 + */ +public class RequestQueue { + private LinkedList queue = new LinkedList(); + + public synchronized Request getRequest(){ + while(queue.size() == 0){ + try{ + wait(); //等待,直到有Request + }catch(InterruptedException e){ + + } + } + + return (Request) queue.remove(); + } + + public synchronized void addRequest(Request request){ + queue.add(request); + notifyAll(); //唤醒getRequest方法 + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java new file mode 100644 index 0000000..356c79c --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java @@ -0,0 +1,28 @@ +package main.java.com.javaCore.java_thread.model.GuardedSuspension; + +/** + * @Author: chenssy + * @Date: 2016/10/26 22:27 + */ +public class ServerThread extends Thread{ + private RequestQueue requestQueue; + + public ServerThread(RequestQueue requestQueue,String name){ + super(name); + this.requestQueue = requestQueue; + } + + @Override + public void run() { + while(true){ + final Request request = requestQueue.getRequest(); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + + } + System.out.println(Thread.currentThread().getName() + " handles " + request); + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java new file mode 100644 index 0000000..2a829ec --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java @@ -0,0 +1,21 @@ +package main.java.com.javaCore.java_thread.model.GuardedSuspension; + +/** + * @Author: chenssy + * @Date: 2016/10/26 22:35 + */ +public class Test { + public static void main(String[] args){ + RequestQueue requestQueue = new RequestQueue(); + + //开启服务端进程 + for(int i = 0 ; i < 10 ; i++){ + new ServerThread(requestQueue,"ServerThread_" + i).start(); + } + + //开启客户端进程 + for(int i = 0 ; i < 10 ; i++){ + new ClientThread(requestQueue,"ClientThread_" + i).start(); + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java new file mode 100644 index 0000000..e02f170 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java @@ -0,0 +1,80 @@ +package main.java.com.javaCore.java_thread.model.MasterWorker; + +import java.util.HashMap; +import java.util.Map; +import java.util.Queue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedDeque; + +/** + * @Author: chenssy + * @Date: 2016/10/26 21:03 + */ +public class Master { + //任务队列 + protected Queue workQueue = new ConcurrentLinkedDeque(); + //Work进程队列 + protected Map threadMap = new HashMap(); + //子任务处理结果集 + protected Map resultMap = new ConcurrentHashMap(); + + /** + * 判断任务是否结束 + * + * @author chenssy + * @date 2016年10月26日 + * @since v1.0.0 + */ + public boolean isComplete(){ + for(Map.Entry entry : threadMap.entrySet()){ + if(entry.getValue().getState() != Thread.State.TERMINATED){ + return false; + } + } + return true; + } + + public Master(Worker worker,int countWorker){ + worker.setWorkerQueue(workQueue); + worker.setResultMap(resultMap); + + for(int i = 0 ; i < countWorker ; i++){ + threadMap.put(Integer.toString(i),new Thread(worker,Integer.toString(i))); + } + } + + /** + * 提交一个任务 + * + * @author chenssy + * @date 2016-10-26 + * @since v1.0.0 + */ + public void submit(Object object){ + workQueue.add(object); + } + + /** + * 获取结果集 + * + * @author chenssy + * @date 2016-10-26 + * @since v1.0.0 + */ + public Map getResultMap(){ + return resultMap; + } + + /** + * 执行子任务 + * + * @author chenssy + * @date 2016年10月26日 + * @since v1.0.0 + */ + public void execute(){ + for (Map.Entry entery:threadMap.entrySet()){ + entery.getValue().start(); + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java new file mode 100644 index 0000000..2a2613c --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java @@ -0,0 +1,13 @@ +package main.java.com.javaCore.java_thread.model.MasterWorker; + +/** + * @Author: chenssy + * @Date: 2016年10月26日 21:25 + */ +public class PlusWorker extends Worker { + @Override + public Object handle(Object input) { + Integer i = (Integer) input; + return i * i * i; + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java new file mode 100644 index 0000000..3e2be68 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java @@ -0,0 +1,48 @@ +package main.java.com.javaCore.java_thread.model.MasterWorker; + +import java.util.Map; +import java.util.Set; + +/** + * @Author: chenssy + * @Date: 2016年10月26日 21:32 + */ +public class Test { + public static void main(String[] args){ + //五个进程跑 + Master master = new Master(new PlusWorker(),5); + + //提交100个子任务 + for(int i = 0 ; i < 100 ; i++){ + master.submit(i); + } + + master.execute(); + + int result = 0 ; + + Map resultMap = master.getResultMap(); + + while(resultMap.size()> 0 || !master.isComplete()){ + Set keys = resultMap.keySet(); + String key = null; + for(String s : keys){ + key = s; + break; + } + + Integer i = null; + + if(key != null){ + i = (Integer) resultMap.get(key); + } + if(i != null){ + result += i; + } + + if(key != null){ + resultMap.remove(key); + } + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java new file mode 100644 index 0000000..e5aacde --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java @@ -0,0 +1,48 @@ +package main.java.com.javaCore.java_thread.model.MasterWorker; + +import java.util.Map; +import java.util.Queue; + +/** + * @Author: chenssy + * @Date: 2016年10月26日 21:15 + */ +public class Worker implements Runnable{ + protected Queue workerQueue; + + protected Map resultMap ; + + public void setWorkerQueue(Queue workerQueue) { + this.workerQueue = workerQueue; + } + + public void setResultMap(Map resultMap) { + this.resultMap = resultMap; + } + + @Override + public void run() { + while (true){ + Object input = workerQueue.poll(); + if(input == null){ + break; + } + + System.out.println("子任务【" + Thread.currentThread().getName() + "】开始执行,执行对象为--" + input.toString()); + Object result = handle(input); + System.out.println("子任务【" + Thread.currentThread().getName() + "】执行完成,结果为:" + result.toString()); + resultMap.put(Integer.toString(input.hashCode()),result); + } + } + + /** + * 子任务处理逻辑,在子类中覆盖执行具体逻辑 + * + * @author chenssy + * @date 2016年10月26日 + * @since v1.0.0 + */ + public Object handle(Object input) { + return input; + } +} From 97b4a4d35577ab25eda18897677eff36101572f3 Mon Sep 17 00:00:00 2001 From: chenssy Date: 2016年10月30日 22:26:02 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Java=20redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 53 +++++---- src/main/java/com/redis/JRedisTest.java | 144 ++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/redis/JRedisTest.java diff --git a/pom.xml b/pom.xml index 3ce17a8..625c69e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,29 +1,42 @@ - - 4.0.0 - JavaCore - JavaCore - 0.0.1-SNAPSHOT + + 4.0.0 + JavaCore + JavaCore + 0.0.1-SNAPSHOT junit junit - 3.8.1 - test + 4.12 + + + redis.clients + jedis + 2.1.0 + + + + commons-pool + commons-pool + 1.6 + + - - src - - - maven-compiler-plugin - 3.1 - - 1.7 - 1.7 - - - - + + src + + + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + + + + \ No newline at end of file diff --git a/src/main/java/com/redis/JRedisTest.java b/src/main/java/com/redis/JRedisTest.java new file mode 100644 index 0000000..86d2b3b --- /dev/null +++ b/src/main/java/com/redis/JRedisTest.java @@ -0,0 +1,144 @@ +package main.java.com.redis; + +import org.junit.Before; +import org.junit.Test; +import redis.clients.jedis.Jedis; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Author: chenssy + * @Date: 2016年10月30日 9:41 + */ +public class JRedisTest { + private Jedis jedis = null; + + @Before + public void setUp(){ + //连接redis服务器 + jedis = new Jedis("localhost"); + } + + /** + * String Test + * + * @author chenssy + * @date 2016年10月30日 + * @since v1.0.0 + */ + @Test + public void stringTest(){ + jedis.set("name", "chenssy"); + System.out.println(jedis.get("name")); + + jedis.append("name","_cmblogs.com"); + System.out.println(jedis.get("name")); + + jedis.del("name"); + System.out.println(jedis.get("name")); + + jedis.mset("name","chenssy","blog","cmsblogs"); + System.out.println(jedis.get("name") + "--" + jedis.get("blog")); + } + + /** + * Map test + * + * @author chenssy + * @date 2016年10月30日 + * @since v1.0.0 + */ + @Test + public void mapTest(){ + Map user = new HashMap(); + user.put("name","chenssy"); + user.put("sex","boy"); //O(∩_∩)O~ + user.put("github","chenssy89"); + user.put("QQ","122448894"); + + jedis.hmset("user" ,user); + + //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 + List list = jedis.hmget("user","name","sex","github","QQ"); + System.out.println(list); + + jedis.hdel("user","QQ"); + System.out.println(jedis.hmget("user", "name", "QQ")); + System.out.println("user 中元素的个数:" + jedis.hlen("user")); + System.out.println("jedis 中是否存在user:" + jedis.exists("user")); + System.out.println("user 中的key:" + jedis.hkeys("user")); + System.out.println("user 中的key:"+jedis.hvals("user")); + } + + /** + * List Test + * + * @author chenssy + * @date 2016年10月30日 + * @since v1.0.0 + */ + @Test + public void listTest(){ + jedis.del("list"); + + jedis.lpush("list","chenssy"); + jedis.lpush("list","boy"); + jedis.lpush("list","chenss89"); + jedis.lpush("list","122448894"); + + /* + *再取出所有数据jedis.lrange是按范围取出, + *第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有 + */ + + System.out.println(jedis.lrange("list",0,-1)); + System.out.println(jedis.lpop("list")); + System.out.println(jedis.lrange("list",0,-1)); + } + + /** + * Set 集合Test + * + * @author chenssy + * @date 2016年10月30日 + * @since v1.0.0 + */ + @Test + public void setTest(){ + jedis.sadd("set","chenssy"); + jedis.sadd("set","boy"); + jedis.sadd("set","chenssy89"); + jedis.sadd("set","122448894"); + jedis.sadd("set","chenssy"); + + System.out.println(jedis.smembers("set")); + System.out.println(jedis.sismember("set", "boy")); + System.out.println(jedis.srandmember("set")); + System.out.println(jedis.scard("set")); + } + + /** + * 排序 + * + * @author chenssy + * @date 2016年10月30日 + * @since v1.0.0 + */ + @Test + public void sortTest(){ + jedis.del("sort"); + + jedis.rpush("sort","8"); + jedis.rpush("sort","7"); + jedis.rpush("sort","9"); + jedis.rpush("sort","6"); + jedis.rpush("sort","4"); + jedis.rpush("sort","5"); + + System.out.println(jedis.lrange("sort",0,-1)); + System.out.println(jedis.sort("sort")); + System.out.println(jedis.lrange("sort",0,-1)); + } +} From 055729d1a820506e5ca07b0b7afafb4a00f4c0f0 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Sun, 6 Nov 2016 12:38:41 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redis=20pool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/redis/JRedisPoolUtils.java | 73 ++++++++++++++++++++ src/main/java/com/redis/JRedisTest.java | 13 ++++ 2 files changed, 86 insertions(+) create mode 100644 src/main/java/com/redis/JRedisPoolUtils.java diff --git a/src/main/java/com/redis/JRedisPoolUtils.java b/src/main/java/com/redis/JRedisPoolUtils.java new file mode 100644 index 0000000..5faf2de --- /dev/null +++ b/src/main/java/com/redis/JRedisPoolUtils.java @@ -0,0 +1,73 @@ +package main.java.com.redis; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +/** + * Redis的连接池 + * + * @author:chenming + * @date : 2016年10月31日 8:56 + */ +public class JRedisPoolUtils { + private final static String REDIS_IP = "localhost"; + + //可用连接实例的最大数目,默认值为8; + //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 + private static int MAX_ACTIVE = 1024; + + //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。 + private static int MAX_IDLE = 200; + + //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException; + private static int MAX_WAIT = 10000; + + private static int TIMEOUT = 10000; + + //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; + private static boolean TEST_ON_BORROW = true; + + private static JedisPool jedisPool = null; + + /** + * 初始化连接池 + */ + static { + JedisPoolConfig config = new JedisPoolConfig(); + config.setMaxActive(MAX_ACTIVE); + config.setMaxIdle(MAX_IDLE); + config.setMaxWait(MAX_WAIT); + config.setTestOnBorrow(TEST_ON_BORROW); + jedisPool = new JedisPool(config,REDIS_IP); + } + + /** + * 获取Redis实例 + * + * @author chenming + * @date 2016年11月06日 + * @since v1.0.0 + */ + public synchronized static Jedis getJedis(){ + if(jedisPool != null){ + return jedisPool.getResource(); + }else{ + return null; + } + } + + /** + * 释放jedis资源 + * + * @author chenming + * @date 2016年11月06日 + * @since v1.0.0 + */ + public static void returnJedis(final Jedis jedis){ + if(jedisPool != null){ + jedisPool.returnResource(jedis); + } + } + +} diff --git a/src/main/java/com/redis/JRedisTest.java b/src/main/java/com/redis/JRedisTest.java index 86d2b3b..ceb7afe 100644 --- a/src/main/java/com/redis/JRedisTest.java +++ b/src/main/java/com/redis/JRedisTest.java @@ -141,4 +141,17 @@ public void sortTest(){ System.out.println(jedis.sort("sort")); System.out.println(jedis.lrange("sort",0,-1)); } + + /** + * 连接池test + * + * @author chenming + * @date 2016年11月06日 + * @since v1.0.0 + */ + @Test + public void redisPoolTest(){ + JRedisPoolUtils.getJedis().set("pool","chenssy-redis-pool"); + System.out.println(JRedisPoolUtils.getJedis().get("pool")); + } } From ee5ea0bb46ec60ab57c4fc0480cc756ada0a7384 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年10月31日 17:35:46 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jedis=E7=9A=84=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E5=BC=8F=EF=BC=88=E5=90=8C=E6=AD=A5=E3=80=81?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E3=80=81=E4=BA=8B=E5=8A=A1=E3=80=81=E5=88=86?= =?UTF-8?q?=E5=B8=83=E5=BC=8F=E3=80=81=E5=88=86=E5=B8=83=E5=BC=8F=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=B1=A0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/redis/RedisInvokeTest.java | 151 +++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/main/java/com/redis/RedisInvokeTest.java diff --git a/src/main/java/com/redis/RedisInvokeTest.java b/src/main/java/com/redis/RedisInvokeTest.java new file mode 100644 index 0000000..0ef082f --- /dev/null +++ b/src/main/java/com/redis/RedisInvokeTest.java @@ -0,0 +1,151 @@ +package main.java.com.redis; + +import org.junit.Test; +import redis.clients.jedis.*; + +import java.util.Arrays; +import java.util.List; + +/** + * Redis 调用方式 + * + * @author chenming + * @date 2016年11月6日 16:12 + */ +public class RedisInvokeTest { + + /** + * 普通同步方式 + * + * @author chenming + * @date 2016年11月06日 + * @since v1.0.0 + */ + @Test + public void normalTest() { + Jedis jedis = new Jedis("localhost"); + + long begin = System.currentTimeMillis(); + + for (int i = 0; i < 1000; i++) { + //set之后都可以返回结果,标记是否成功 + System.out.println(i + "---" + jedis.set("n_" + i, "n_" + i)); + } + + long end = System.currentTimeMillis(); + + System.out.println("normal Set:" + (end - begin)); + + jedis.disconnect(); + } + + /** + * 事务方式调用 + * + * 主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令 + * + * @author chenming + * @date 2016-11-06 + * @since v1.0.0 + */ + @Test + public void transTest() { + Jedis jedis = new Jedis("localhost"); + + long begin = System.currentTimeMillis(); + Transaction transaction = jedis.multi(); + for (int i = 0; i < 1000; i++) { + transaction.set("t_" + i, "t_" + i); + } + List result = transaction.exec(); + + long end = System.currentTimeMillis(); + + System.out.println("Transaction Set:" + (end - begin)); + jedis.disconnect(); + System.out.println(result); + } + + /** + * 管道方式调用 + * 采用异步方式,一次发送多个指令,不同步等待其返回结果 + * + * @author chenming + * @date 2016-11-06 + * @since v1.0.0 + */ + @Test + public void PipelinedTest() { + Jedis jedis = new Jedis("localhost"); + + long begin = System.currentTimeMillis(); + Pipeline pipeline = jedis.pipelined(); + for (int i = 0; i < 1000; i++) { + pipeline.set("p_" + i, "p_" + i); + } + List result = pipeline.syncAndReturnAll(); + + long end = System.currentTimeMillis(); + + System.out.println("pipeline Set:" + (end - begin)); + jedis.disconnect(); + System.out.println(result); + } + + /** + * 分布式直连同步调用/异步改为ShardedJedisPipeline 即可 + * + * @author chenming + * @date 2016-10-31 + * @since v1.0.0 + */ + @Test + public void shardNormalTest(){ + List shards = Arrays.asList( + new JedisShardInfo("localhost",6379), + new JedisShardInfo("localhost",6380) + ); + + ShardedJedis sharding = new ShardedJedis(shards); + + long start = System.currentTimeMillis(); + for (int i = 0; i < 1000; i++) { + String result = sharding.set("shardNormal " + i, "sn" + i); + } + + long end = System.currentTimeMillis(); + System.out.println("shardNormal SET: " + (end - start)); + + sharding.disconnect(); + } + + /** + * 分布式连接池异步调用 + * + * @author chenming + * @date 2016-10-31 + * @since v1.0.0 + */ + @Test + public void shardPipelinedPoolTest(){ + List shards = Arrays.asList( + new JedisShardInfo("localhost",6379), + new JedisShardInfo("localhost",6380)); + + ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(),shards); + + ShardedJedis one = pool.getResource(); + ShardedJedisPipeline pipeline = one.pipelined(); + + long start = System.currentTimeMillis(); + for (int i = 0; i < 1000; i++) { + pipeline.set("shardPipelinedPool" + i, "n" + i); + } + List results = pipeline.syncAndReturnAll(); + long end = System.currentTimeMillis(); + + pool.returnResource(one); + System.out.println("shardPipelinedPool SET: " + (end - start)); + pool.destroy(); + } +} From 03390d1b6f2d05d4343024f47d0f5501164f7b19 Mon Sep 17 00:00:00 2001 From: chenssy Date: Tue, 1 Nov 2016 20:27:32 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=BF=9E=E6=8E=A5=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../threadPool/custom/PThread.java | 66 ++++++++++++++++ .../java_thread/threadPool/custom/Test.java | 42 ++++++++++ .../threadPool/custom/ThreadPool.java | 79 +++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java create mode 100644 src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java create mode 100644 src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java diff --git a/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java b/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java new file mode 100644 index 0000000..3b22129 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java @@ -0,0 +1,66 @@ +package main.java.com.javaCore.java_thread.threadPool.custom; + +/** + * @author chenssy + * @date 2016年10月31日 + * @since v1.0.0 + */ +public class PThread extends Thread{ + //线程池 + private ThreadPool pool; + + //任务 + private Runnable target; + + private boolean isShutDown = false; + private boolean isIdle = false; + + public PThread(Runnable target,String name,ThreadPool pool){ + super(name); + this.pool = pool; + this.target = target; + } + + public Runnable getTarget(){ + return target; + } + + public boolean isIdle(){ + return isIdle; + } + + public void run(){ + while(!isShutDown){ + isIdle = true; + if(target != null){ + target.run(); //运行线程 + } + + //任务结束了,到闲置状态 + isIdle = true; + + try { + pool.repool(this); + synchronized (this){ + //线程空闲,等待任务到来 + wait(); + } + } catch (InterruptedException e) { + + } + isIdle = false; + } + } + + public synchronized void setTarget(Runnable newTarget){ + target = newTarget; + //设置任务后,通知run方法,执行任务 + notifyAll(); + } + + //关闭线程 + public synchronized void shutDown(){ + isShutDown = true; + notifyAll(); + } +} diff --git a/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java b/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java new file mode 100644 index 0000000..ef42050 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java @@ -0,0 +1,42 @@ +package main.java.com.javaCore.java_thread.threadPool.custom; + +/** + * @author chenssy + * @date 2016年10月31日 + * @since v1.0.0 + */ +public class Test { + + public static void main(String[] args){ + long begin1 = System.currentTimeMillis(); + for(int i = 0 ; i < 500 ; i++){ + new Thread(new MyThread("no pool_"+i)).start(); + } + long end1 = System.currentTimeMillis(); + + long begin2 = System.currentTimeMillis(); + for(int i = 0 ; i < 500 ; i++){ + ThreadPool.getInstance().start(new MyThread("pool_"+i)); + } + long end2 = System.currentTimeMillis(); + + System.out.println("no pool times:" + (end1 - begin1)); + System.out.println("pool times:" + (end2 - begin2)); + } + + private static class MyThread implements Runnable{ + String name = null; + public MyThread(String name) { + this.name = name; + } + + @Override + public void run() { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java b/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java new file mode 100644 index 0000000..b7d22b5 --- /dev/null +++ b/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java @@ -0,0 +1,79 @@ +package main.java.com.javaCore.java_thread.threadPool.custom; + +import java.util.List; +import java.util.Vector; + +/** + * 自定义线程池 + * @author chenssy + * @date 2016/10/31 21:38 + */ +public class ThreadPool { + private static ThreadPool instance = null; + + //空闲的线程队列 + private List idleThreads; + + private int threadCounter; + private boolean isShutDown = false; + + private ThreadPool(){ + this.idleThreads = new Vector(5); + threadCounter = 0; + } + + public int getCreatedThreadsCount(){ + return threadCounter; + } + + public synchronized static ThreadPool getInstance(){ + if(instance == null){ + instance = new ThreadPool(); + } + return instance; + } + + //将线程加入线程池中 + protected synchronized void repool(PThread thread){ + if(!isShutDown){ + idleThreads.add(thread); + }else{ + thread.shutDown(); + } + } + + /** + * 停止池中所有线程 + * + * @author chenssy + * @date 2016年10月31日 + * @since v1.0.0 + */ + public synchronized void shutDown(){ + isShutDown = true; + for(int i = 0 ; i < idleThreads.size() ; i++){ + PThread thread = (PThread) idleThreads.get(i); + thread.shutDown(); + } + } + + public synchronized void start(Runnable runnable){ + PThread thread = null; + //有空闲线程 直接使用 + if(idleThreads.size()> 0){ + int lastIndex = idleThreads.size() - 1; + thread = (PThread) idleThreads.get(lastIndex); + + idleThreads.remove(thread); + + //执行任务 + thread.setTarget(thread); + }else{ //没有空闲线程,则创建新的线程 + threadCounter++; + thread = new PThread(runnable,"PThread #" + threadCounter,this); + + //启动该线程 + thread.start(); + } + } +} From c7db5d7953c0a8d866251013d3f305dd8f61234f Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年11月15日 09:08:47 +0800 Subject: [PATCH 16/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0JVM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/JVM/stack/TestStack.java | 30 +++++++++++++++++++ .../model/GuardedSuspension/ClientThread.java | 2 +- .../model/GuardedSuspension/Request.java | 2 +- .../model/GuardedSuspension/RequestQueue.java | 2 +- .../model/GuardedSuspension/ServerThread.java | 2 +- .../model/GuardedSuspension/Test.java | 2 +- .../model/MasterWorker/Master.java | 2 +- .../model/MasterWorker/PlusWorker.java | 2 +- .../java_thread/model/MasterWorker/Test.java | 2 +- .../model/MasterWorker/Worker.java | 2 +- .../java/com/javaCore/jvm/_1/JConsole.java | 24 --------------- src/main/java/com/redis/JRedisPoolUtils.java | 2 +- src/main/java/com/redis/JRedisTest.java | 2 +- src/main/java/com/redis/RedisInvokeTest.java | 2 +- 14 files changed, 42 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/JVM/stack/TestStack.java delete mode 100644 src/main/java/com/javaCore/jvm/_1/JConsole.java diff --git a/src/main/java/com/JVM/stack/TestStack.java b/src/main/java/com/JVM/stack/TestStack.java new file mode 100644 index 0000000..c914b34 --- /dev/null +++ b/src/main/java/com/JVM/stack/TestStack.java @@ -0,0 +1,30 @@ +package com.JVM.stack; + +import org.junit.Test; + +/** + * 测试当前栈的深度 + * + * @author chenssy + * @date 2016年11月15日 + * @since v1.0.0 + */ +public class TestStack { + private int count = 0; + + public void recursion(){ + count++; + recursion(); + } + + @Test + public void testStack(){ + try { + recursion(); + } catch (Throwable e) { + System.out.println("Deep of stack is " + count); + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java index ed885aa..f334e9f 100644 --- a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ClientThread.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.GuardedSuspension; +package com.javaCore.java_thread.model.GuardedSuspension; /** * @Author: chenssy diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java index 9bcfbbd..c26e12c 100644 --- a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Request.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.GuardedSuspension; +package com.javaCore.java_thread.model.GuardedSuspension; /** * @Author: chenssy diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java index 206016c..830e07c 100644 --- a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/RequestQueue.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.GuardedSuspension; +package com.javaCore.java_thread.model.GuardedSuspension; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java index 356c79c..25249cd 100644 --- a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/ServerThread.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.GuardedSuspension; +package com.javaCore.java_thread.model.GuardedSuspension; /** * @Author: chenssy diff --git a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java index 2a829ec..7837200 100644 --- a/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java +++ b/src/main/java/com/javaCore/java_thread/model/GuardedSuspension/Test.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.GuardedSuspension; +package com.javaCore.java_thread.model.GuardedSuspension; /** * @Author: chenssy diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java index e02f170..8bb2a70 100644 --- a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Master.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.MasterWorker; +package com.javaCore.java_thread.model.MasterWorker; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java index 2a2613c..931448b 100644 --- a/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/PlusWorker.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.MasterWorker; +package com.javaCore.java_thread.model.MasterWorker; /** * @Author: chenssy diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java index 3e2be68..4d7f8c8 100644 --- a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Test.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.MasterWorker; +package com.javaCore.java_thread.model.MasterWorker; import java.util.Map; import java.util.Set; diff --git a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java index e5aacde..b719783 100644 --- a/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java +++ b/src/main/java/com/javaCore/java_thread/model/MasterWorker/Worker.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.model.MasterWorker; +package com.javaCore.java_thread.model.MasterWorker; import java.util.Map; import java.util.Queue; diff --git a/src/main/java/com/javaCore/jvm/_1/JConsole.java b/src/main/java/com/javaCore/jvm/_1/JConsole.java deleted file mode 100644 index 8413cde..0000000 --- a/src/main/java/com/javaCore/jvm/_1/JConsole.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.javaCore.jvm._1; - -import java.util.ArrayList; -import java.util.List; - - -public class JConsole { - static class OOMObject{ - public byte[] placeholder = new byte[64 * 1024]; - } - - public static void fillHeap(int numb) throws InterruptedException { - List list = new ArrayList(); - for(int i = 0 ; i < numb ; i++){ - Thread.sleep(500); - list.add(new OOMObject()); - } - System.gc(); - } - - public static void main(String[] args) throws InterruptedException { - fillHeap(1000); - } -} diff --git a/src/main/java/com/redis/JRedisPoolUtils.java b/src/main/java/com/redis/JRedisPoolUtils.java index 5faf2de..beae345 100644 --- a/src/main/java/com/redis/JRedisPoolUtils.java +++ b/src/main/java/com/redis/JRedisPoolUtils.java @@ -1,4 +1,4 @@ -package main.java.com.redis; +package com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; diff --git a/src/main/java/com/redis/JRedisTest.java b/src/main/java/com/redis/JRedisTest.java index ceb7afe..6a330e2 100644 --- a/src/main/java/com/redis/JRedisTest.java +++ b/src/main/java/com/redis/JRedisTest.java @@ -1,4 +1,4 @@ -package main.java.com.redis; +package com.redis; import org.junit.Before; import org.junit.Test; diff --git a/src/main/java/com/redis/RedisInvokeTest.java b/src/main/java/com/redis/RedisInvokeTest.java index 0ef082f..d78f83b 100644 --- a/src/main/java/com/redis/RedisInvokeTest.java +++ b/src/main/java/com/redis/RedisInvokeTest.java @@ -1,4 +1,4 @@ -package main.java.com.redis; +package com.redis; import org.junit.Test; import redis.clients.jedis.*; From 264272038c0000ef3b555234054c262488077f42 Mon Sep 17 00:00:00 2001 From: chenssy Date: 2016年11月19日 18:34:17 +0800 Subject: [PATCH 17/25] =?UTF-8?q?JVM=E5=AD=A6=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/JVM/heap/HeapGCTest.java | 18 ++++++++ src/main/java/com/JVM/perm/PermGengc.java | 16 +++++++ src/main/java/com/JVM/stack/StackGCTest.java | 45 ++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/main/java/com/JVM/heap/HeapGCTest.java create mode 100644 src/main/java/com/JVM/perm/PermGengc.java create mode 100644 src/main/java/com/JVM/stack/StackGCTest.java diff --git a/src/main/java/com/JVM/heap/HeapGCTest.java b/src/main/java/com/JVM/heap/HeapGCTest.java new file mode 100644 index 0000000..f001e5b --- /dev/null +++ b/src/main/java/com/JVM/heap/HeapGCTest.java @@ -0,0 +1,18 @@ +package main.java.com.JVM.heap; + +/** + * Java GC测试 + * @author chenssy + * @date 2016年11月19日 + * @since v1.0.0 + */ +public class HeapGCTest { + //VM参数:-Xms=40 -Xmx40m -Xmn20m + public static void main(String[] args){ + byte[] b1 = new byte[1024 * 1024 / 2]; + byte[] b2 = new byte[2014 * 1024 * 8]; + + b2 = null; + b2 = new byte[2014 * 1024 * 8]; + } +} diff --git a/src/main/java/com/JVM/perm/PermGengc.java b/src/main/java/com/JVM/perm/PermGengc.java new file mode 100644 index 0000000..7d5f04e --- /dev/null +++ b/src/main/java/com/JVM/perm/PermGengc.java @@ -0,0 +1,16 @@ +package main.java.com.JVM.perm; + +/** + * 常量池GC策略:只要常量池中的常量没有被任何地方引用,就可以被回收 + * @author chenssy + * @date 2016年11月19日 + * @since v1.0.0 + */ +public class PermGengc { + + public static void main(String[] args){ + for(int i = 0 ; i < Integer.MAX_VALUE ; i++){ + String t = String.valueOf(i).intern(); + } + } +} diff --git a/src/main/java/com/JVM/stack/StackGCTest.java b/src/main/java/com/JVM/stack/StackGCTest.java new file mode 100644 index 0000000..580eb2e --- /dev/null +++ b/src/main/java/com/JVM/stack/StackGCTest.java @@ -0,0 +1,45 @@ +package main.java.com.JVM.stack; + +/** + * @author chenssy + * @date 2016/11/19 + * @since v1.0.0 + */ +public class StackGCTest { + + //如果一个局部变量被保存在局部变量表中,那么GC就能引用到这个局部变量所指向的内存空间 + //从而在GC时,可能无法回收这部分空间 + public static void test1(){ + { + byte[] bytes = new byte[6 * 1024 * 1024]; + } + System.gc(); + System.out.println("first explict gc over"); + } + + //手工释放该空间,将变量设置为null + public static void test2(){ + { + byte[] bytes = new byte[6 * 1024 * 1024]; + bytes = null; + } + System.gc(); + System.out.println("first explict gc over"); + } + + //或者重新声明一个新的局部变量,从而复用该变量的字,使其所占有的空间可以被GC回收 + public static void test3(){ + { + byte[] bytes = new byte[6 * 1024 * 1024]; + } + int a = 0; + System.gc(); + System.out.println("first explict gc over"); + } + + + public static void main(String[] args){ + test1(); +// test2(); + } +} From d5bf15ab6d3aae85a674c946d2d32705e1d1bc95 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2016年11月21日 09:31:38 +0800 Subject: [PATCH 18/25] add nio --- .../java/com/JVM/stack/WordReuseTest.java | 23 +++++++++++ src/main/java/com/NIO/core/BufferTest.java | 41 +++++++++++++++++++ src/main/java/com/NIO/core/ChannelTest.java | 29 +++++++++++++ .../JUC/Atomic/AtomicReferenceTest.java | 2 +- .../JUC/ThreadUtils/Exchanger/Test.java | 6 +-- .../threadPool/custom/PThread.java | 2 +- .../java_thread/threadPool/custom/Test.java | 2 +- .../threadPool/custom/ThreadPool.java | 4 +- src/main/resources/rebel.xml | 9 ++++ 9 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/JVM/stack/WordReuseTest.java create mode 100644 src/main/java/com/NIO/core/BufferTest.java create mode 100644 src/main/java/com/NIO/core/ChannelTest.java create mode 100644 src/main/resources/rebel.xml diff --git a/src/main/java/com/JVM/stack/WordReuseTest.java b/src/main/java/com/JVM/stack/WordReuseTest.java new file mode 100644 index 0000000..0515a7e --- /dev/null +++ b/src/main/java/com/JVM/stack/WordReuseTest.java @@ -0,0 +1,23 @@ +package com.JVM.stack; + +/** + * 局部变量对GC的影响; + * + * + * @author chenssy + * @date 2016年11月17日 + * @since v1.0.0 + */ +public class WordReuseTest { + public static void test(){ + { + byte[] b = new byte[6 * 1024 * 1024]; + } + System.gc(); + System.out.println("first explict gc over"); + } + + public static void main(String[] args){ + test(); + } +} diff --git a/src/main/java/com/NIO/core/BufferTest.java b/src/main/java/com/NIO/core/BufferTest.java new file mode 100644 index 0000000..ff27740 --- /dev/null +++ b/src/main/java/com/NIO/core/BufferTest.java @@ -0,0 +1,41 @@ +package com.NIO.core; + +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +/** + * Buffer测试
      + * buffer使用步骤: + * 1、写入数据到Buffer + * 2、调用flip()方法 + * 3、从Buffer中读取数据 + * 4、调用clear()方法或者compact()方法 + * + * @author chenming + * @date 2016年11月21日 + * @since v1.0.0 + */ +public class BufferTest { + public static void main(String[] args) throws Exception { + RandomAccessFile file = new RandomAccessFile("E:/workspace/channelTest.txt","rw"); + + FileChannel fileChannel = file.getChannel(); + + //对buffer对象进行分配 + ByteBuffer buf = ByteBuffer.allocate(24); + + int bytesRead = fileChannel.read(buf); + while (bytesRead != -1){ + buf.flip(); //切换到读模式 + while (buf.hasRemaining()){ + System.out.println((char)buf.get()); + } + + buf.clear(); //清空缓存 + bytesRead = fileChannel.read(buf); + } + + file.close(); + } +} diff --git a/src/main/java/com/NIO/core/ChannelTest.java b/src/main/java/com/NIO/core/ChannelTest.java new file mode 100644 index 0000000..cdaebf9 --- /dev/null +++ b/src/main/java/com/NIO/core/ChannelTest.java @@ -0,0 +1,29 @@ +package com.NIO.core; + +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +public class ChannelTest { + public static void main(String[] args) throws Exception { + RandomAccessFile file = new RandomAccessFile("E:/workspace/channelTest.txt","rw"); + + FileChannel fileChannel = file.getChannel(); + + ByteBuffer buf = ByteBuffer.allocate(8); + + int bytesRead = fileChannel.read(buf); + while (bytesRead != -1){ + System.out.println("Read " + bytesRead); + buf.flip(); + while (buf.hasRemaining()){ + System.out.println((char)buf.get()); + } + + buf.clear(); + bytesRead = fileChannel.read(buf); + } + + file.close(); + } +} diff --git a/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java index 52f8299..e5ed2c3 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java +++ b/src/main/java/com/javaCore/java_thread/JUC/Atomic/AtomicReferenceTest.java @@ -32,7 +32,7 @@ public String toString() { } } - private static AtomicReference atomicReference = new AtomicReference(); + private static AtomicReference atomicReference = new AtomicReference(); public static void main(String[] args){ User user = new User("chenssy",18); diff --git a/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java index 6a2aa21..636875a 100644 --- a/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java +++ b/src/main/java/com/javaCore/java_thread/JUC/ThreadUtils/Exchanger/Test.java @@ -6,10 +6,10 @@ public class Test { public static void main(String[] args) { - List buffer1 = new ArrayList(); - List buffer2 = new ArrayList(); + List buffer1 = new ArrayList(); + List buffer2 = new ArrayList(); - Exchanger> exchanger = new Exchanger(); + Exchanger> exchanger = new Exchanger>(); Producer producer = new Producer(buffer1, exchanger); Consumer consumer = new Consumer(buffer2, exchanger); diff --git a/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java b/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java index 3b22129..19a8d1f 100644 --- a/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java +++ b/src/main/java/com/javaCore/java_thread/threadPool/custom/PThread.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.threadPool.custom; +package com.javaCore.java_thread.threadPool.custom; /** * @author chenssy diff --git a/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java b/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java index ef42050..67bfb00 100644 --- a/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java +++ b/src/main/java/com/javaCore/java_thread/threadPool/custom/Test.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.threadPool.custom; +package com.javaCore.java_thread.threadPool.custom; /** * @author chenssy diff --git a/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java b/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java index b7d22b5..cb824f0 100644 --- a/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java +++ b/src/main/java/com/javaCore/java_thread/threadPool/custom/ThreadPool.java @@ -1,4 +1,4 @@ -package main.java.com.javaCore.java_thread.threadPool.custom; +package com.javaCore.java_thread.threadPool.custom; import java.util.List; import java.util.Vector; @@ -18,7 +18,7 @@ public class ThreadPool { private boolean isShutDown = false; private ThreadPool(){ - this.idleThreads = new Vector(5); + this.idleThreads = new Vector(5); threadCounter = 0; } diff --git a/src/main/resources/rebel.xml b/src/main/resources/rebel.xml new file mode 100644 index 0000000..49eb40f --- /dev/null +++ b/src/main/resources/rebel.xml @@ -0,0 +1,9 @@ + + + + + + + + + From 5e1ea9b04257019ef2581bc625e5d92597e75bf7 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2017年5月28日 08:42:14 +0800 Subject: [PATCH 19/25] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Netty=20=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../java/com/NIO/netty/base/TimeClient.java | 43 +++++ .../com/NIO/netty/base/TimeClientHandler.java | 45 +++++ .../java/com/NIO/netty/base/TimeServer.java | 52 ++++++ .../NIO/netty/base/TimerServerHandler.java | 39 +++++ .../NIO/nio/_1/MultiplexerTimerServer.java | 162 ++++++++++++++++++ .../java/com/NIO/nio/_1/TimeClientHandle.java | 82 +++++++++ src/main/java/com/redis/Test.java | 4 + src/test/Test.java | 12 ++ 9 files changed, 444 insertions(+) create mode 100644 src/main/java/com/NIO/netty/base/TimeClient.java create mode 100644 src/main/java/com/NIO/netty/base/TimeClientHandler.java create mode 100644 src/main/java/com/NIO/netty/base/TimeServer.java create mode 100644 src/main/java/com/NIO/netty/base/TimerServerHandler.java create mode 100644 src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java create mode 100644 src/main/java/com/NIO/nio/_1/TimeClientHandle.java create mode 100644 src/main/java/com/redis/Test.java create mode 100644 src/test/Test.java diff --git a/pom.xml b/pom.xml index 625c69e..4077b45 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,11 @@ 1.6 + + io.netty + netty-all + 5.0.0.Alpha2 + diff --git a/src/main/java/com/NIO/netty/base/TimeClient.java b/src/main/java/com/NIO/netty/base/TimeClient.java new file mode 100644 index 0000000..14673e1 --- /dev/null +++ b/src/main/java/com/NIO/netty/base/TimeClient.java @@ -0,0 +1,43 @@ +package main.java.com.NIO.netty.base; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +public class TimeClient { + + public void connect(int port, String host) { + // 配置客户端线程组 + EventLoopGroup group = new NioEventLoopGroup(); + + Bootstrap b = new Bootstrap(); + + try { + b.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast(new TimeClientHandler()); + } + }); + + // 发起异步连接操作 + ChannelFuture future = b.connect(host, port); + + // 等待客户端链路关闭 + + future.channel().closeFuture().sync(); + } catch (InterruptedException e) { + + } finally { + group.shutdownGracefully(); + } + } + + public static void main(String[] args) { + new TimeClient().connect(8899,"127.0.0.1"); + } +} diff --git a/src/main/java/com/NIO/netty/base/TimeClientHandler.java b/src/main/java/com/NIO/netty/base/TimeClientHandler.java new file mode 100644 index 0000000..fea2367 --- /dev/null +++ b/src/main/java/com/NIO/netty/base/TimeClientHandler.java @@ -0,0 +1,45 @@ +package main.java.com.NIO.netty.base; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +public class TimeClientHandler extends ChannelHandlerAdapter{ + + private final ByteBuf firstMessage; + + public TimeClientHandler(){ + byte[] req = "QUERY TIME ORDER".getBytes(); + firstMessage = Unpooled.buffer(req.length); + + firstMessage.writeBytes(req); + } + + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + ctx.writeAndFlush(firstMessage); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + ByteBuf buf = (ByteBuf) msg; + + byte[] req = new byte[buf.readableBytes()]; + buf.readBytes(req); + + String body = new String(req,"UTF-8"); + + System.out.println("Now is :" + body); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + + System.out.println("cause by :" + cause.getMessage()); + + ctx.close(); + } +} diff --git a/src/main/java/com/NIO/netty/base/TimeServer.java b/src/main/java/com/NIO/netty/base/TimeServer.java new file mode 100644 index 0000000..5cdf8ea --- /dev/null +++ b/src/main/java/com/NIO/netty/base/TimeServer.java @@ -0,0 +1,52 @@ +package main.java.com.NIO.netty.base; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +public class TimeServer { + + public void bind(int port){ + // 配置服务端的NIO线程组 + EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于服务端接受客户端的连接 + EventLoopGroup workerGroup = new NioEventLoopGroup(); // 用于进行SocketChannel的网络读写 + + try { + // ServerBootstrap 用于启动NIO服务端的辅助启动类,目的是降低服务端的开发复杂度 + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 1024) + .childHandler(new ChildChannelHanlder()); + + // 绑定端口,同步等待成功 + ChannelFuture future = b.bind(port).sync(); + // 等待服务端监听端口关闭 + future.channel().closeFuture().sync(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + // 优雅地关闭 + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + private class ChildChannelHanlder extends ChannelInitializer{ + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast(new TimerServerHandler()); + } + } + + public static void main(String[] args){ + new TimeServer().bind(8899); + } +} diff --git a/src/main/java/com/NIO/netty/base/TimerServerHandler.java b/src/main/java/com/NIO/netty/base/TimerServerHandler.java new file mode 100644 index 0000000..428ff5d --- /dev/null +++ b/src/main/java/com/NIO/netty/base/TimerServerHandler.java @@ -0,0 +1,39 @@ +package main.java.com.NIO.netty.base; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +import java.util.Date; + + +public class TimerServerHandler extends ChannelHandlerAdapter{ + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + ByteBuf buf = (ByteBuf) msg; + + byte[] req = new byte[buf.readableBytes()]; + buf.readBytes(req); + + String body = new String(req,"UTF-8"); + System.out.println("The time server receive order:" + body); + + String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER"; + + ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes()); + + ctx.write(resp); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + ctx.close(); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } +} diff --git a/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java b/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java new file mode 100644 index 0000000..d1a264b --- /dev/null +++ b/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java @@ -0,0 +1,162 @@ +package main.java.com.NIO.nio._1; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Date; +import java.util.Iterator; +import java.util.Set; + +/** + * 服务器端 + * + * @author chenssy + * @date 2017年04月20日 + * @since v1.0.0 + */ +public class MultiplexerTimerServer implements Runnable{ + + // 多路复用器 + private Selector selector; + + // 通道 + private ServerSocketChannel serverSocketChannel; + + private volatile boolean stop; + + MultiplexerTimerServer(int port){ + try { + // 打开通道channel,监听客户端连接 + selector = Selector.open(); + + serverSocketChannel = ServerSocketChannel.open(); + //监听端口 + serverSocketChannel.socket().bind(new InetSocketAddress(port),1024); + // 设置为非阻塞 + serverSocketChannel.configureBlocking(false); + + //将通道channel注册到多路复用器selector上面 + serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); + + System.out.println("The time server is start in port:" + port); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void stop(){ + this.stop = true; + } + + @Override + public void run() { + while (!stop){ + try { + selector.select(1000); + + Set selectionKeys = selector.selectedKeys(); + Iterator it = selectionKeys.iterator(); + + SelectionKey key = null; + + while (it.hasNext()){ + key = it.next(); + + it.remove(); + + try { + handleInput(key); + } catch (IOException e) { + if(key != null){ + key.cancel(); + if(key.channel() != null){ + key.channel().close(); + } + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + // 多路复用器关闭后,所有注册在上面的Channel等资源都会自动去注册并关闭,所以不需要重复释放资源 + if(selector != null){ + try { + selector.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 处理链接请求 + * + * @author chenssy + * @date 2017年04月20日 + * @since v1.0.0 + */ + private void handleInput(SelectionKey key) throws IOException { + if(key.isValid()){ + // 处理新接入的请求 + if(key.isAcceptable()){ + ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); + + SocketChannel channel = ssc.accept(); + ssc.configureBlocking(false); + ssc.register(selector,SelectionKey.OP_READ); // 准备读 + } + + // 读取数据 + if(key.isReadable()){ + SocketChannel sc = (SocketChannel) key.channel(); + + ByteBuffer readBuffer = ByteBuffer.allocate(1024); + + int readBytes = sc.read(readBuffer); + + if(readBytes> 0){ + readBuffer.flip(); + + byte[] bytes = new byte[readBuffer.remaining()]; + + readBuffer.get(bytes); + String body = new String(bytes,"UTF-8"); + + System.out.println("The time server receive order:" + body); + String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER"; + + doWrite(sc,currentTime); + }else if(readBytes < 0){ + // 关闭终端 + key.cancel(); + sc.close(); + } + } + } + } + + /** + * 向客户端写入数据 + * + * @author chenssy + * @date 2017-04-20 + * @since v1.0.0 + */ + private void doWrite(SocketChannel channel, String response) throws IOException { + if(response != null && response.trim().length()> 0){ + byte[] bytes = response.getBytes(); + + ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length); + + writeBuffer.put(bytes); + writeBuffer.flip(); + channel.write(writeBuffer); + } + } +} diff --git a/src/main/java/com/NIO/nio/_1/TimeClientHandle.java b/src/main/java/com/NIO/nio/_1/TimeClientHandle.java new file mode 100644 index 0000000..1e60add --- /dev/null +++ b/src/main/java/com/NIO/nio/_1/TimeClientHandle.java @@ -0,0 +1,82 @@ +package main.java.com.NIO.nio._1; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; + +public class TimeClientHandle implements Runnable{ + private String host; + + private int port; + + private Selector selector; + + private SocketChannel socketChannel; + + private volatile boolean stop; + + public TimeClientHandle(String host,int port){ + this.host = host == null ? "127.0.0.1" : host; + this.port = port; + + try { + selector = Selector.open(); + socketChannel = SocketChannel.open(); + socketChannel.configureBlocking(false); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + @Override + public void run() { + try { + doConnect(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * 链接服务端 + * 如果链接成功,则注册到多路复用器上,发送请求消息,读应答 + * @author chenming + * @date 2017年04月20日 + * @since v1.0.0 + */ + private void doConnect() throws IOException { + if(socketChannel.connect(new InetSocketAddress(host,port))){ + socketChannel.register(selector, SelectionKey.OP_READ); + dowWrite(socketChannel); + }else{ + socketChannel.register(selector,SelectionKey.OP_CONNECT); + } + } + + /** + * 发送消息 + * + * @author chenming + * @date 2017年04月20日 + * @since v1.0.0 + */ + private void dowWrite(SocketChannel socketChannel) throws IOException { + byte[] req = "QUERY TIME ORDER".getBytes(); + + ByteBuffer writeBuffer = ByteBuffer.allocate(req.length); + + writeBuffer.put(req); + writeBuffer.flip(); + + socketChannel.write(writeBuffer); + + if(!writeBuffer.hasRemaining()){ + System.out.println("Send order 2 Server succeed."); + } + } +} diff --git a/src/main/java/com/redis/Test.java b/src/main/java/com/redis/Test.java new file mode 100644 index 0000000..2d39fe0 --- /dev/null +++ b/src/main/java/com/redis/Test.java @@ -0,0 +1,4 @@ +package com.redis; + +public class Test { +} diff --git a/src/test/Test.java b/src/test/Test.java new file mode 100644 index 0000000..cabd6d4 --- /dev/null +++ b/src/test/Test.java @@ -0,0 +1,12 @@ +package test; + +import java.util.concurrent.CopyOnWriteArrayList; + +public class Test { + + public static void main(String[] args) { + CopyOnWriteArrayList c = new CopyOnWriteArrayList(); + c.get(1); + } + +} From aba85e118e7b2af3cabd87e3696642c8f8cdc104 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Fri, 5 May 2017 08:58:39 +0800 Subject: [PATCH 20/25] =?UTF-8?q?TCP/IP=20=E6=9C=AA=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=B2=98=E5=8C=85=E6=8B=86=E5=8C=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../netty/tcpIP/NotStickers/TimeClient.java | 46 ++++++++++++++++ .../tcpIP/NotStickers/TimeClientHandler.java | 52 +++++++++++++++++++ .../netty/tcpIP/NotStickers/TimeServer.java | 52 +++++++++++++++++++ .../tcpIP/NotStickers/TimerServerHandler.java | 45 ++++++++++++++++ 4 files changed, 195 insertions(+) create mode 100644 src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java create mode 100644 src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java create mode 100644 src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java create mode 100644 src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java new file mode 100644 index 0000000..1a5b298 --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java @@ -0,0 +1,46 @@ +package main.java.com.NIO.netty.tcpIP.NotStickers; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +public class TimeClient { + + public void connect(int port, String host) { + // 配置客户端线程组 + EventLoopGroup group = new NioEventLoopGroup(); + + Bootstrap b = new Bootstrap(); + + try { + b.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast(new TimeClientHandler()); + } + }); + + // 发起异步连接操作 + ChannelFuture future = b.connect(host, port); + + // 等待客户端链路关闭 + + future.channel().closeFuture().sync(); + } catch (InterruptedException e) { + + } finally { + group.shutdownGracefully(); + } + } + + public static void main(String[] args) { + new TimeClient().connect(8899,"127.0.0.1"); + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java new file mode 100644 index 0000000..7dc860e --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java @@ -0,0 +1,52 @@ +package main.java.com.NIO.netty.tcpIP.NotStickers; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +public class TimeClientHandler extends ChannelHandlerAdapter{ + + private int counter; + + private byte[] req; + + + public TimeClientHandler(){ + req = ("QUERY TIME ORDER" + System.getProperty("line.separator")).getBytes(); + } + + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + ByteBuf message = null; + + for (int i = 0 ; i < 100 ; i++){ + message = Unpooled.buffer(req.length); + message.writeBytes(req); + + ctx.writeAndFlush(message); + } + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + ByteBuf buf = (ByteBuf) msg; + + byte[] req = new byte[buf.readableBytes()]; + buf.readBytes(req); + + String body = new String(req,"UTF-8"); + + System.out.println("Now is :" + body + "; the conters is :" + (++counter)); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + + System.out.println("cause by :" + cause.getMessage()); + + ctx.close(); + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java new file mode 100644 index 0000000..c8e3baa --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java @@ -0,0 +1,52 @@ +package main.java.com.NIO.netty.tcpIP.NotStickers; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +public class TimeServer { + + public void bind(int port){ + // 配置服务端的NIO线程组 + EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于服务端接受客户端的连接 + EventLoopGroup workerGroup = new NioEventLoopGroup(); // 用于进行SocketChannel的网络读写 + + try { + // ServerBootstrap 用于启动NIO服务端的辅助启动类,目的是降低服务端的开发复杂度 + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 1024) + .childHandler(new ChildChannelHanlder()); + + // 绑定端口,同步等待成功 + ChannelFuture future = b.bind(port).sync(); + // 等待服务端监听端口关闭 + future.channel().closeFuture().sync(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + // 优雅地关闭 + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + private class ChildChannelHanlder extends ChannelInitializer{ + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast(new TimerServerHandler()); + } + } + + public static void main(String[] args){ + new TimeServer().bind(8899); + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java new file mode 100644 index 0000000..1dae48b --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java @@ -0,0 +1,45 @@ +package main.java.com.NIO.netty.tcpIP.NotStickers; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +import java.util.Date; + +/** + * 未考虑粘包拆包 + * + * @author chenssy + * @date 2017年05月05日 + * @since v1.0.0 + */ +public class TimerServerHandler extends ChannelHandlerAdapter{ + + private int counter; + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + ByteBuf buf = (ByteBuf) msg; + + byte[] req = new byte[buf.readableBytes()]; + buf.readBytes(req); + + String body = new String(req,"UTF-8").substring(0,req.length - System.getProperty("line.separator").length()); + + System.out.println("The time server receive order:" + body + "; the counter is " + (++counter)); + + String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER"; + + currentTime = currentTime + System.getProperty("line.separator"); + + ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes()); + + ctx.writeAndFlush(resp); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + ctx.close(); + } +} From ed82fa947b9122d4017653b664d22f595da009d4 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Fri, 5 May 2017 12:41:35 +0800 Subject: [PATCH 21/25] =?UTF-8?q?LineBasedFrameDecoder=20StringDecoder=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=B2=98=E5=8C=85=E6=8B=86=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NIO/netty/tcpIP/stickers/TimeClient.java | 50 +++++++++++++++ .../tcpIP/stickers/TimeClientHandler.java | 49 +++++++++++++++ .../NIO/netty/tcpIP/stickers/TimeServer.java | 61 +++++++++++++++++++ .../tcpIP/stickers/TimerServerHandler.java | 40 ++++++++++++ 4 files changed, 200 insertions(+) create mode 100644 src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java create mode 100644 src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java create mode 100644 src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java create mode 100644 src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java new file mode 100644 index 0000000..e689400 --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java @@ -0,0 +1,50 @@ +package main.java.com.NIO.netty.tcpIP.stickers; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; + +public class TimeClient { + + public void connect(int port, String host) { + // 配置客户端线程组 + EventLoopGroup group = new NioEventLoopGroup(); + + Bootstrap b = new Bootstrap(); + + try { + b.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new StringDecoder()); + socketChannel.pipeline().addLast(new TimeClientHandler()); + } + }); + + // 发起异步连接操作 + ChannelFuture future = b.connect(host, port); + + // 等待客户端链路关闭 + + future.channel().closeFuture().sync(); + } catch (InterruptedException e) { + + } finally { + group.shutdownGracefully(); + } + } + + public static void main(String[] args) { + new TimeClient().connect(8899,"127.0.0.1"); + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java new file mode 100644 index 0000000..fd3a26c --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java @@ -0,0 +1,49 @@ +package main.java.com.NIO.netty.tcpIP.stickers; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +public class TimeClientHandler extends ChannelHandlerAdapter{ + + private int counter; + + private byte[] req; + + + public TimeClientHandler(){ + req = ("QUERY TIME ORDER" + System.getProperty("line.separator")).getBytes(); + } + + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + ByteBuf message = null; + + for (int i = 0 ; i < 100 ; i++){ + message = Unpooled.buffer(req.length); + message.writeBytes(req); + + ctx.writeAndFlush(message); + } + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + + + String body = (String) msg; + + System.out.println("Now is :" + body + "; the conters is :" + (++counter)); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + + System.out.println("cause by :" + cause.getMessage()); + + ctx.close(); + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java new file mode 100644 index 0000000..87da475 --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java @@ -0,0 +1,61 @@ +package main.java.com.NIO.netty.tcpIP.stickers; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; + + +public class TimeServer { + + public void bind(int port){ + // 配置服务端的NIO线程组 + EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于服务端接受客户端的连接 + EventLoopGroup workerGroup = new NioEventLoopGroup(); // 用于进行SocketChannel的网络读写 + + try { + // ServerBootstrap 用于启动NIO服务端的辅助启动类,目的是降低服务端的开发复杂度 + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 1024) + .childHandler(new ChildChannelHanlder()); + + // 绑定端口,同步等待成功 + ChannelFuture future = b.bind(port).sync(); + // 等待服务端监听端口关闭 + future.channel().closeFuture().sync(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + // 优雅地关闭 + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + private class ChildChannelHanlder extends ChannelInitializer{ + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + + // 解码器 + socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); + socketChannel.pipeline().addLast(new StringDecoder()); + + // 服务处理 + socketChannel.pipeline().addLast(new TimerServerHandler()); + } + } + + public static void main(String[] args){ + new TimeServer().bind(8899); + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java new file mode 100644 index 0000000..22b7b2d --- /dev/null +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java @@ -0,0 +1,40 @@ +package main.java.com.NIO.netty.tcpIP.stickers; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +import java.util.Date; + +/** + * 未考虑粘包拆包 + * + * @author chenssy + * @date 2017年05月05日 + * @since v1.0.0 + */ +public class TimerServerHandler extends ChannelHandlerAdapter{ + + private int counter; + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + String body = (String) msg; + + System.out.println("The time server receive order:" + body + "; the counter is :" + (++counter)); + + String currentTime = " QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER"; + + currentTime = currentTime + System.getProperty("line.separator"); + + ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes()); + + ctx.writeAndFlush(resp); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + ctx.close(); + } +} From 7bceaf31506683348c7facc97c79eb76750ced01 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Tue, 9 May 2017 08:55:55 +0800 Subject: [PATCH 22/25] add DelimiterBasedFrameDecoder --- .../EchoClient.java | 50 ++++++++++++++++ .../EchoClientHandler.java | 35 +++++++++++ .../EchoServer.java | 58 +++++++++++++++++++ .../EchoServerHandler.java | 32 ++++++++++ 4 files changed, 175 insertions(+) create mode 100644 src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java create mode 100644 src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java create mode 100644 src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java create mode 100644 src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java new file mode 100644 index 0000000..37c1923 --- /dev/null +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java @@ -0,0 +1,50 @@ +package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; + +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; + +public class EchoClient { + public void connect(int port,String host) throws Exception { + EventLoopGroup group = new NioEventLoopGroup(); + + try { + Bootstrap sb = new Bootstrap(); + sb.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()); + + socketChannel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, delimiter)); + + socketChannel.pipeline().addLast(new StringDecoder()); + + socketChannel.pipeline().addLast(new EchoClientHandler()); + } + }); + + ChannelFuture f = sb.connect(host,port).sync(); + + f.channel().closeFuture().sync(); + } finally { + group.shutdownGracefully(); + } + } + + public static void main(String[] args) throws Exception { + new EchoClient().connect(8999,"127.0.0.1"); + } + + +} diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java new file mode 100644 index 0000000..2fe3c69 --- /dev/null +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java @@ -0,0 +1,35 @@ +package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +public class EchoClientHandler extends ChannelHandlerAdapter{ + private int counter; + + // 末尾增加$_ + static final String ECHO_REQ = "Hi,chenssy,welcome to netty.$_"; + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + for(int i = 0 ; i < 10 ; i++){ + ctx.writeAndFlush(Unpooled.copiedBuffer(ECHO_REQ.getBytes())); + } + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("This is " + (++counter) + " times receive server:[" + msg + "]"); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java new file mode 100644 index 0000000..1e7090f --- /dev/null +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java @@ -0,0 +1,58 @@ +package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; + +/** + * DelimiterBasedFrameDecoder 服务端 + * + * @author chenssy + * @date 2017-05-08 + * @since v1.0.0 + */ +public class EchoServer { + + public void bind(int port) throws Exception { + // 配置线程组 + EventLoopGroup boosGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap sb = new ServerBootstrap(); + sb.group(boosGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 100) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel channel) throws Exception { + ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()); + channel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, delimiter)); + + channel.pipeline().addLast(new StringDecoder()); + channel.pipeline().addLast(new EchoServerHandler()); + } + }); + + //绑定端口 + ChannelFuture f = sb.bind(port).sync(); + + //等待服务端监听端口关闭 + f.channel().closeFuture().sync(); + } finally { + boosGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + public static void main(String[] args) throws Exception { + new EchoServer().bind(8999); + } + +} diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java new file mode 100644 index 0000000..4f8d898 --- /dev/null +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java @@ -0,0 +1,32 @@ +package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +public class EchoServerHandler extends ChannelHandlerAdapter{ + + private int counter = 0; + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + String body = (String) msg; + + System.out.println("This is " + (++counter) + " times reveive client:[" + body + "]"); + + if(counter % 3 == 0){ + body += "$_"; + } + + ByteBuf buf = Unpooled.copiedBuffer(body.getBytes()); + + ctx.writeAndFlush(buf); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} From 01ae9934f4c7aac25a9f592c6201382300099b69 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: Tue, 9 May 2017 12:44:36 +0800 Subject: [PATCH 23/25] add FixedLengthFrameDecoder --- .../FixedLengthFrameDecoder/EchoServer.java | 61 +++++++++++++++++++ .../EchoServerHandler.java | 26 ++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java create mode 100644 src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java diff --git a/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java new file mode 100644 index 0000000..199d2f9 --- /dev/null +++ b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java @@ -0,0 +1,61 @@ +package main.java.com.NIO.netty.frameDecoder.FixedLengthFrameDecoder; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.FixedLengthFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; + +/** + * DelimiterBasedFrameDecoder 服务端 + * + * @author chenssy + * @date 2017年05月08日 + * @since v1.0.0 + */ +public class EchoServer { + + public void bind(int port) throws Exception { + // 配置线程组 + EventLoopGroup boosGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap sb = new ServerBootstrap(); + sb.group(boosGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 100) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel channel) throws Exception { + channel.pipeline().addLast(new FixedLengthFrameDecoder(20)); + + channel.pipeline().addLast(new StringDecoder()); + channel.pipeline().addLast(new EchoServerHandler()); + } + }); + + //绑定端口 + ChannelFuture f = sb.bind(port).sync(); + + //等待服务端监听端口关闭 + f.channel().closeFuture().sync(); + } finally { + boosGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + public static void main(String[] args) throws Exception { + new EchoServer().bind(8999); + } + +} diff --git a/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java new file mode 100644 index 0000000..88bf1cc --- /dev/null +++ b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java @@ -0,0 +1,26 @@ +package main.java.com.NIO.netty.frameDecoder.FixedLengthFrameDecoder; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; + +public class EchoServerHandler extends ChannelHandlerAdapter{ + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + String body = (String) msg; + + System.out.println("Receive client : [" + body + "]"); + + ByteBuf buf = Unpooled.copiedBuffer(body.getBytes()); + + ctx.writeAndFlush(buf); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} From 65a7b4c16125ecd9073f99e3198521af10b6ff34 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2017年5月12日 08:37:34 +0800 Subject: [PATCH 24/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/JVM/heap/HeapGCTest.java | 2 +- src/main/java/com/JVM/perm/PermGengc.java | 2 +- src/main/java/com/JVM/stack/StackGCTest.java | 2 +- src/main/java/com/NIO/netty/base/TimeClient.java | 3 ++- src/main/java/com/NIO/netty/base/TimeClientHandler.java | 2 +- src/main/java/com/NIO/netty/base/TimeServer.java | 2 +- src/main/java/com/NIO/netty/base/TimerServerHandler.java | 2 +- .../frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java | 2 +- .../DelimiterBasedFrameDecoder/EchoClientHandler.java | 2 +- .../frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java | 2 +- .../DelimiterBasedFrameDecoder/EchoServerHandler.java | 2 +- .../netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java | 2 +- .../FixedLengthFrameDecoder/EchoServerHandler.java | 2 +- src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java | 2 +- .../com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java | 2 +- src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java | 2 +- .../com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java | 2 +- src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java | 2 +- .../java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java | 2 +- src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java | 2 +- .../java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java | 2 +- src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java | 2 +- src/main/java/com/NIO/nio/_1/TimeClientHandle.java | 2 +- 23 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/JVM/heap/HeapGCTest.java b/src/main/java/com/JVM/heap/HeapGCTest.java index f001e5b..4d975c2 100644 --- a/src/main/java/com/JVM/heap/HeapGCTest.java +++ b/src/main/java/com/JVM/heap/HeapGCTest.java @@ -1,4 +1,4 @@ -package main.java.com.JVM.heap; +package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.JVM.heap; /** * Java GC测试 diff --git a/src/main/java/com/JVM/perm/PermGengc.java b/src/main/java/com/JVM/perm/PermGengc.java index 7d5f04e..d1fb6e5 100644 --- a/src/main/java/com/JVM/perm/PermGengc.java +++ b/src/main/java/com/JVM/perm/PermGengc.java @@ -1,4 +1,4 @@ -package main.java.com.JVM.perm; +package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.JVM.perm; /** * 常量池GC策略:只要常量池中的常量没有被任何地方引用,就可以被回收 diff --git a/src/main/java/com/JVM/stack/StackGCTest.java b/src/main/java/com/JVM/stack/StackGCTest.java index 580eb2e..98efc49 100644 --- a/src/main/java/com/JVM/stack/StackGCTest.java +++ b/src/main/java/com/JVM/stack/StackGCTest.java @@ -1,4 +1,4 @@ -package main.java.com.JVM.stack; +package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.JVM.stack; /** * @author chenssy diff --git a/src/main/java/com/NIO/netty/base/TimeClient.java b/src/main/java/com/NIO/netty/base/TimeClient.java index 14673e1..e3519a0 100644 --- a/src/main/java/com/NIO/netty/base/TimeClient.java +++ b/src/main/java/com/NIO/netty/base/TimeClient.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.base; +package com.NIO.netty.base; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; @@ -29,6 +29,7 @@ protected void initChannel(SocketChannel socketChannel) throws Exception { // 等待客户端链路关闭 + future.channel().closeFuture().sync(); } catch (InterruptedException e) { diff --git a/src/main/java/com/NIO/netty/base/TimeClientHandler.java b/src/main/java/com/NIO/netty/base/TimeClientHandler.java index fea2367..5fc2c53 100644 --- a/src/main/java/com/NIO/netty/base/TimeClientHandler.java +++ b/src/main/java/com/NIO/netty/base/TimeClientHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.base; +package com.NIO.netty.base; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/base/TimeServer.java b/src/main/java/com/NIO/netty/base/TimeServer.java index 5cdf8ea..428a541 100644 --- a/src/main/java/com/NIO/netty/base/TimeServer.java +++ b/src/main/java/com/NIO/netty/base/TimeServer.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.base; +package com.NIO.netty.base; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/main/java/com/NIO/netty/base/TimerServerHandler.java b/src/main/java/com/NIO/netty/base/TimerServerHandler.java index 428ff5d..5ee15b9 100644 --- a/src/main/java/com/NIO/netty/base/TimerServerHandler.java +++ b/src/main/java/com/NIO/netty/base/TimerServerHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.base; +package com.NIO.netty.base; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java index 37c1923..0256bee 100644 --- a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClient.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; +package com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java index 2fe3c69..bcd3434 100644 --- a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoClientHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; +package com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerAdapter; diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java index 1e7090f..dab9ff6 100644 --- a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServer.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; +package com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java index 4f8d898..4bfca85 100644 --- a/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java +++ b/src/main/java/com/NIO/netty/frameDecoder/DelimiterBasedFrameDecoder/EchoServerHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; +package com.NIO.netty.frameDecoder.DelimiterBasedFrameDecoder; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java index 199d2f9..d566b4e 100644 --- a/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java +++ b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServer.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.frameDecoder.FixedLengthFrameDecoder; +package com.NIO.netty.frameDecoder.FixedLengthFrameDecoder; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java index 88bf1cc..f56f605 100644 --- a/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java +++ b/src/main/java/com/NIO/netty/frameDecoder/FixedLengthFrameDecoder/EchoServerHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.frameDecoder.FixedLengthFrameDecoder; +package com.NIO.netty.frameDecoder.FixedLengthFrameDecoder; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java index 1a5b298..867e2d5 100644 --- a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClient.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.NotStickers; +package com.NIO.netty.tcpIP.NotStickers; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java index 7dc860e..0e5fdcf 100644 --- a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeClientHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.NotStickers; +package com.NIO.netty.tcpIP.NotStickers; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java index c8e3baa..46b12f0 100644 --- a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimeServer.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.NotStickers; +package com.NIO.netty.tcpIP.NotStickers; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java index 1dae48b..a3460cc 100644 --- a/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java +++ b/src/main/java/com/NIO/netty/tcpIP/NotStickers/TimerServerHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.NotStickers; +package com.NIO.netty.tcpIP.NotStickers; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java index e689400..8ad90b7 100644 --- a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.stickers; +package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.NIO.netty.tcpIP.stickers; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java index fd3a26c..c7b51ea 100644 --- a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.stickers; +package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.NIO.netty.tcpIP.stickers; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java index 87da475..40fe4d1 100644 --- a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeServer.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.stickers; +package com.NIO.netty.tcpIP.stickers; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java index 22b7b2d..d12f329 100644 --- a/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimerServerHandler.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.netty.tcpIP.stickers; +package com.NIO.netty.tcpIP.stickers; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java b/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java index d1a264b..d5625aa 100644 --- a/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java +++ b/src/main/java/com/NIO/nio/_1/MultiplexerTimerServer.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.nio._1; +package com.NIO.nio._1; import java.io.IOException; import java.net.InetSocketAddress; diff --git a/src/main/java/com/NIO/nio/_1/TimeClientHandle.java b/src/main/java/com/NIO/nio/_1/TimeClientHandle.java index 1e60add..c35f192 100644 --- a/src/main/java/com/NIO/nio/_1/TimeClientHandle.java +++ b/src/main/java/com/NIO/nio/_1/TimeClientHandle.java @@ -1,4 +1,4 @@ -package main.java.com.NIO.nio._1; +package com.NIO.nio._1; import java.io.IOException; import java.net.InetSocketAddress; From 216f274580c2d2e4347585862be30894fd780b00 Mon Sep 17 00:00:00 2001 From: chenssy89 Date: 2017年5月12日 09:26:46 +0800 Subject: [PATCH 25/25] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../netty/Http/fileServer/HttpFileServer.java | 50 +++++++++++++++++++ .../fileServer/HttpFileServerHandler.java | 16 ++++++ .../NIO/netty/tcpIP/stickers/TimeClient.java | 2 +- .../tcpIP/stickers/TimeClientHandler.java | 2 +- 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/NIO/netty/Http/fileServer/HttpFileServer.java create mode 100644 src/main/java/com/NIO/netty/Http/fileServer/HttpFileServerHandler.java diff --git a/src/main/java/com/NIO/netty/Http/fileServer/HttpFileServer.java b/src/main/java/com/NIO/netty/Http/fileServer/HttpFileServer.java new file mode 100644 index 0000000..435a6e8 --- /dev/null +++ b/src/main/java/com/NIO/netty/Http/fileServer/HttpFileServer.java @@ -0,0 +1,50 @@ +package com.NIO.netty.Http.fileServer; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpRequestDecoder; +import io.netty.handler.codec.http.HttpResponseEncoder; +import io.netty.handler.stream.ChunkedWriteHandler; + +public class HttpFileServer { + private static final String DEFAULT_URL = "/src/main/java/come/NIO/netty"; + + public void run(int port, final String url) throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try{ + ServerBootstrap sb = new ServerBootstrap(); + sb.group(bossGroup,workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast("http-decoder",new HttpRequestDecoder()); + socketChannel.pipeline().addLast("http-aggregator",new HttpObjectAggregator(65536)); + socketChannel.pipeline().addLast("http-encoder",new HttpResponseEncoder()); + socketChannel.pipeline().addLast("http-chunked",new ChunkedWriteHandler()); + socketChannel.pipeline().addLast("fileServerHandler",new HttpFileServerHandler(url)); + } + }); + + ChannelFuture future = sb.bind("127.0.0.1",port); + System.out.println("HTTP 文件目录服务器启动,网址是:http://127.0.0.1"); + + future.channel().closeFuture().sync(); + }finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + public static void main(String[] args) throws Exception { + new HttpFileServer().run(8999,"127.0.0.1"); + } +} diff --git a/src/main/java/com/NIO/netty/Http/fileServer/HttpFileServerHandler.java b/src/main/java/com/NIO/netty/Http/fileServer/HttpFileServerHandler.java new file mode 100644 index 0000000..23dde24 --- /dev/null +++ b/src/main/java/com/NIO/netty/Http/fileServer/HttpFileServerHandler.java @@ -0,0 +1,16 @@ +package com.NIO.netty.Http.fileServer; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.FullHttpRequest; + +public class HttpFileServerHandler extends SimpleChannelInboundHandler{ + public HttpFileServerHandler(String url) { + + } + + @Override + protected void messageReceived(ChannelHandlerContext channelHandlerContext, FullHttpRequest fullHttpRequest) throws Exception { + + } +} diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java index 8ad90b7..9c841a0 100644 --- a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClient.java @@ -1,4 +1,4 @@ -package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.NIO.netty.tcpIP.stickers; +package com.NIO.netty.tcpIP.stickers; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java index c7b51ea..32cf920 100644 --- a/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java +++ b/src/main/java/com/NIO/netty/tcpIP/stickers/TimeClientHandler.java @@ -1,4 +1,4 @@ -package com.ufclub.ljs.autoInvest.model.AutoInvestSettingcom.NIO.netty.tcpIP.stickers; +package com.NIO.netty.tcpIP.stickers; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled;

      AltStyle によって変換されたページ (->オリジナル) /