diff --git a/.gitignore b/.gitignore
index 49a37d0..1de5659 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
-MultiThread_demo/bin
-MultiThread_demo/.settings
\ No newline at end of file
+target
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
index 0e40fe8..5c98b42 100644
--- a/.idea/.gitignore
+++ b/.idea/.gitignore
@@ -1,3 +1,2 @@
-
# Default ignored files
/workspace.xml
\ No newline at end of file
diff --git a/.idea/MultiThreadPro.iml b/.idea/MultiThreadPro.iml
new file mode 100644
index 0000000..85b1662
--- /dev/null
+++ b/.idea/MultiThreadPro.iml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..511b0c0
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/dictionaries/xycode.xml b/.idea/dictionaries/xycode.xml
new file mode 100644
index 0000000..f98e000
--- /dev/null
+++ b/.idea/dictionaries/xycode.xml
@@ -0,0 +1,9 @@
+
+
+
+ nanos
+ reentrant
+ xycode
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index 6e8e052..0000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..6560a98
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_beust_jcommander_1_72.xml b/.idea/libraries/Maven__com_beust_jcommander_1_72.xml
new file mode 100644
index 0000000..ad12dd9
--- /dev/null
+++ b/.idea/libraries/Maven__com_beust_jcommander_1_72.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml
new file mode 100644
index 0000000..d411041
--- /dev/null
+++ b/.idea/libraries/Maven__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.xml b/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.xml
new file mode 100644
index 0000000..3b84834
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.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/libraries/Maven__org_openjdk_jol_jol_core_0_9.xml b/.idea/libraries/Maven__org_openjdk_jol_jol_core_0_9.xml
new file mode 100644
index 0000000..366b137
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjdk_jol_jol_core_0_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_testng_testng_6_14_3.xml b/.idea/libraries/Maven__org_testng_testng_6_14_3.xml
new file mode 100644
index 0000000..3e0d80c
--- /dev/null
+++ b/.idea/libraries/Maven__org_testng_testng_6_14_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/annotations_17_0_0.xml b/.idea/libraries/annotations_17_0_0.xml
deleted file mode 100644
index 1e44f17..0000000
--- a/.idea/libraries/annotations_17_0_0.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/disruptor_3_4_2.xml b/.idea/libraries/disruptor_3_4_2.xml
deleted file mode 100644
index a4add2a..0000000
--- a/.idea/libraries/disruptor_3_4_2.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 79223a5..71e13c4 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,9 +1,13 @@
-
-
+
+
+
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index a231978..db2f06c 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,7 +2,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/Java-MultiThread-Study.iml b/MultiThreadDP.iml
similarity index 51%
rename from .idea/Java-MultiThread-Study.iml
rename to MultiThreadDP.iml
index 2900e7a..c90834f 100644
--- a/.idea/Java-MultiThread-Study.iml
+++ b/MultiThreadDP.iml
@@ -3,12 +3,9 @@
-
-
+
-
-
\ No newline at end of file
diff --git a/MultiThread_demo/.classpath b/MultiThread_demo/.classpath
deleted file mode 100644
index 5143540..0000000
--- a/MultiThread_demo/.classpath
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/MultiThread_demo/.project b/MultiThread_demo/.project
deleted file mode 100644
index 40385c7..0000000
--- a/MultiThread_demo/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- MultiThread_demo
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
-
-
diff --git a/MultiThread_demo/Alice-log.txt b/MultiThread_demo/Alice-log.txt
deleted file mode 100644
index 168bd93..0000000
--- a/MultiThread_demo/Alice-log.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-i = 0
-i = 1
-i = 2
-i = 3
-i = 4
-i = 5
-i = 6
-i = 7
-i = 8
-i = 9
-==== end of log ====
diff --git a/MultiThread_demo/Bob-log.txt b/MultiThread_demo/Bob-log.txt
deleted file mode 100644
index 168bd93..0000000
--- a/MultiThread_demo/Bob-log.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-i = 0
-i = 1
-i = 2
-i = 3
-i = 4
-i = 5
-i = 6
-i = 7
-i = 8
-i = 9
-==== end of log ====
diff --git a/MultiThread_demo/Charis-log.txt b/MultiThread_demo/Charis-log.txt
deleted file mode 100644
index 168bd93..0000000
--- a/MultiThread_demo/Charis-log.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-i = 0
-i = 1
-i = 2
-i = 3
-i = 4
-i = 5
-i = 6
-i = 7
-i = 8
-i = 9
-==== end of log ====
diff --git a/MultiThread_demo/lib/annotations-17.0.0.jar b/MultiThread_demo/lib/annotations-17.0.0.jar
deleted file mode 100644
index 477f7d0..0000000
Binary files a/MultiThread_demo/lib/annotations-17.0.0.jar and /dev/null differ
diff --git a/MultiThread_demo/lib/disruptor-3.4.2.jar b/MultiThread_demo/lib/disruptor-3.4.2.jar
deleted file mode 100644
index b366bbe..0000000
Binary files a/MultiThread_demo/lib/disruptor-3.4.2.jar and /dev/null differ
diff --git a/MultiThread_demo/lib/jmatrices0.6.jar b/MultiThread_demo/lib/jmatrices0.6.jar
deleted file mode 100644
index 8d79555..0000000
Binary files a/MultiThread_demo/lib/jmatrices0.6.jar and /dev/null differ
diff --git a/MultiThread_demo/src/com/xycode/DH/Constant.java b/MultiThread_demo/src/com/xycode/DH/Constant.java
deleted file mode 100644
index 276b5c3..0000000
--- a/MultiThread_demo/src/com/xycode/DH/Constant.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.xycode.DH;
-
-import java.util.Random;
-
-public class Constant {
- public final static int a=5;
- public final static int p=23;
- public static Random r=new Random();
- public static int get(int private_key) {//获得密钥计算过程中的中间结果
- return ((int)Math.pow(a,private_key))%p;
- }
-
- public static int get(int f, int s) {//生成最终的密钥
- return ((int)Math.pow(f,s))%p;
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/DH/DHClient.java b/MultiThread_demo/src/com/xycode/DH/DHClient.java
deleted file mode 100644
index 160418d..0000000
--- a/MultiThread_demo/src/com/xycode/DH/DHClient.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.xycode.DH;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-
-public class DHClient implements Runnable{
- private static ExecutorService es=Executors.newCachedThreadPool();
- private int private_key;
- private int server_DH_KEY;//中间结果
- private int final_DH_KEY;//最终的密钥
-
- public DHClient(int private_key) {
- this.private_key = private_key;
- }
-
- @Override
- public void run() {
- Socket client=null;
- PrintWriter writer=null;
- BufferedReader reader=null;
- try {
- client=new Socket();
- //client.bind(new InetSocketAddress("localhost",12345));//静态绑定,固定端口
- client.connect(new InetSocketAddress("localhost",8888));
- //连接到Server监听的ip与port,client所用的port是随机分配的,除非之前bind(port)
- writer=new PrintWriter(client.getOutputStream(),true);
- writer.println("Client_DH_KEY : "+Constant.get(private_key));
- reader=new BufferedReader(new InputStreamReader(client.getInputStream()));
- String inputLine=null;
- while((inputLine=reader.readLine())!=null) {
- String[] s=inputLine.split(" : ");
- if(s[0].equals(new String("Server_DH_KEY"))) {
- server_DH_KEY=Integer.parseInt(s[1]);
- final_DH_KEY=Constant.get(Constant.get(private_key),server_DH_KEY);
- }
- break;
- }
- int info=Constant.r.nextInt(1000);
- writer.println("Client_INFO : "+(info^final_DH_KEY));
- System.out.println("Client send : "+info);
- }catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- if(writer!=null) writer.close();
- if(reader!=null) reader.close();
- if(client!=null) client.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
- for(int i=0;i<10;++i) {//10个ClientSocket连接
- Thread.sleep(500);
- es.execute(new DHClient(Constant.r.nextInt(1000)));
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/DH/DHServer.java b/MultiThread_demo/src/com/xycode/DH/DHServer.java
deleted file mode 100644
index f7db55d..0000000
--- a/MultiThread_demo/src/com/xycode/DH/DHServer.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.xycode.DH;
-/* 非对称密钥交换
- * Diffie-Hellman算法
- * 将其应用在Socket编程中,安全地生成密钥后,应用简单的异或加密来验证一下
- *
- */
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-
-public class DHServer {
- private static ExecutorService es=Executors.newCachedThreadPool();
- //ServerSocket可能会管理多个Client连接,故采用Map存储密钥信息
- private static Map client_DH_KEY=new HashMap<>();//中间结果
- private static Map final_DH_KEY=new HashMap<>();//最终的密钥
- private static int private_key;
- static class handle_msg implements Runnable{
- Socket client_socket;
- public handle_msg(Socket client_socket) {
- this.client_socket = client_socket;
- }
-
- @Override
- public void run() {
- BufferedReader is=null;
- PrintWriter os=null;
- try {
- is=new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
- os=new PrintWriter(client_socket.getOutputStream(),true);//autoFlush=true
- String inputLine=null;
- while((inputLine=is.readLine())!=null) {
- String[] s=inputLine.split(" : ");
- if(s[0].equals(new String("Client_DH_KEY"))) {
- client_DH_KEY.put(client_socket, Integer.parseInt(s[1]));
- final_DH_KEY.put(client_socket,Constant.get(Constant.get(private_key),Integer.parseInt(s[1])));
- os.println("Server_DH_KEY : "+Constant.get(private_key));
- }else if(s[0].equals(new String("Client_INFO"))){
- int info=Integer.parseInt(s[1])^final_DH_KEY.get(client_socket);
- System.out.println("DHServer recv : "+info);
- }else {
- System.out.println("Format Error!");
- break;
- }
- }
- }catch (Exception e) {
- e.printStackTrace();
- }finally {
- try{
- if(is!=null) is.close();
- if(os!=null) os.close();
- if(client_socket!=null) client_socket.close();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
-
- }
-
- public static void main(String[] args) {
- ServerSocket echoServer=null;
- Socket clientSocket=null;
- try {
- echoServer=new ServerSocket(8888);
- }catch (Exception e) {
- e.printStackTrace();
- }
- private_key=123;
- while(true) {
- try {
- clientSocket=echoServer.accept();//监听echoServer的8888端口
- System.out.println(clientSocket.getRemoteSocketAddress()+" connected.");
- es.execute(new handle_msg(clientSocket));
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/Executor/Executor_demo_1.java b/MultiThread_demo/src/com/xycode/Executor/Executor_demo_1.java
deleted file mode 100644
index 49f4355..0000000
--- a/MultiThread_demo/src/com/xycode/Executor/Executor_demo_1.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.xycode.Executor;
-/**
- * 实现任务的创建(调用)与任务的执行分离
- * @author xycode
- *
- */
-public class Executor_demo_1 {
-
- public static void main(String[] args) {
- MyChannel channel=new MyChannel(10);
- channel.start();
- new MyClient("Alice",channel).start();
- new MyClient("Bob",channel).start();
- new MyClient("Charis",channel).start();
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/Executor/MyChannel.java b/MultiThread_demo/src/com/xycode/Executor/MyChannel.java
deleted file mode 100644
index 0881762..0000000
--- a/MultiThread_demo/src/com/xycode/Executor/MyChannel.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xycode.Executor;
-
-import java.util.concurrent.LinkedBlockingQueue;
-
-public class MyChannel {
- private static final int MAX_REQUEST=100;
- private final LinkedBlockingQueue requestQueue;
-
- private final MyWorker[] workerPool;
-
- public MyChannel(int workerNum) {
- this.requestQueue=new LinkedBlockingQueue<>(MAX_REQUEST);
- this.workerPool=new MyWorker[workerNum];
-
- for(int i=0;i requestQueue;
-
- ExecutorService workerPool;
-
- public MyChannel() {
- this.requestQueue=new LinkedBlockingQueue<>(MAX_REQUEST);
- this.workerPool=Executors.newCachedThreadPool();
- }
-
- public void start(int workerNum) {
- for(int i=0;i0.5)
- request=new MyRequest(super.getName(),++cnt);
- else
- request=new MyRequest2(super.getName(), ++cnt);
- channel.putRequest(request);
- try {
- Thread.sleep(450);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest.java b/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest.java
deleted file mode 100644
index 81c58a0..0000000
--- a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.xycode.Executor.pro;
-
-public class MyRequest implements Request{
- private String name;
- private int id;
- public MyRequest(String name, int id) {
- super();
- this.name = name;
- this.id = id;
- }
-
-
- @Override
- public void task() {
- System.out.println(Thread.currentThread().getName()+" executes "+this);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public String toString() {
- return "{ Request from "+name+ ", TaskId="+id+"}";
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest2.java b/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest2.java
deleted file mode 100644
index e65edda..0000000
--- a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.xycode.Executor.pro;
-
-public class MyRequest2 implements Request{
- private String name;
- private int id;
- public MyRequest2(String name, int id) {
- super();
- this.name = name;
- this.id = id;
- }
-
-
- @Override
- public void task() {
- System.out.println(Thread.currentThread().getName()+" executes "+this);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public String toString() {
- return "{ Request from "+name+ ", Task2Id="+id+"}";
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/MyWorker.java b/MultiThread_demo/src/com/xycode/Executor/pro/MyWorker.java
deleted file mode 100644
index 7a82e86..0000000
--- a/MultiThread_demo/src/com/xycode/Executor/pro/MyWorker.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.xycode.Executor.pro;
-
-public class MyWorker extends Thread{
- private final MyChannel channel;
- public MyWorker(String name,MyChannel channel) {
- super(name);
- this.channel = channel;
- }
-
- public void cancel() {
- this.interrupt();
- }
-
- @Override
- public void run() {
- while(true) {
- if(Thread.currentThread().isInterrupted()) {//中断式的停止,最为安全
- System.out.println(Thread.currentThread().getName()+" interrupted, exit!");
- break;
- }
- Request request=channel.takeRequest();
- request.task();
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/Request.java b/MultiThread_demo/src/com/xycode/Executor/pro/Request.java
deleted file mode 100644
index 62749d0..0000000
--- a/MultiThread_demo/src/com/xycode/Executor/pro/Request.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.xycode.Executor.pro;
-
-public interface Request {
- public void task();
-}
diff --git a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo.java b/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo.java
deleted file mode 100644
index 9524189..0000000
--- a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.xycode.LockWork;
-/**
- * AtomicData类,底层原理是CAS,在竞争不是太激烈的情况下,性能优于加锁的方式
- * 更高级的还有AtomicReference,针对一般的类进行封装,不过要手动的进行CAS操作,CompareAndSet
- */
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.ReentrantLock;
-
-
-public class AtomicDemo implements Runnable{
- static AtomicInteger i=new AtomicInteger(0);//原子Integer类,初值赋为0,底层原理是CAS
- static int k=0;
- int mode;
- public static ReentrantLock lock=new ReentrantLock(false);
-
- public AtomicDemo(int mode) {
- super();
- this.mode = mode;
- }
-
- @Override
- public void run() {
- if(mode==0) {
- //1900
- for(int j=0;j<10000000;++j) {
- i.incrementAndGet();//相当于++i,AtomicInteger不支持形如++i,i++的操作,必须通过api
- }
- }else {
- //10ms
- lock.lock();
- for(int j=0;j<10000000;++j) {
- ++k;
-
- }
- lock.unlock();
-
- //2000ms
- //AtomicInteger的方法性能比下面这个稍好一些,远不如上面那种更优的加锁方式(锁粗化)
-// for(int j=0;j<10000000;++j) {
-// lock.lock();
-// ++k;
-// lock.unlock();
-// }
- }
-
- }
-
- public static void main(String[] args) {
-// long b=System.currentTimeMillis();
-// ExecutorService es=new ThreadPoolExecutor(10,10,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) {
-// @Override
-// protected void beforeExecute(Thread t, Runnable r) {
-// super.beforeExecute(t, r);//默认是空的方法
-//
-// }
-// @Override
-// protected void afterExecute(Runnable r, Throwable t) {
-// super.afterExecute(r, t);
-//
-// }
-// @Override
-// protected void terminated() {
-// super.terminated();//默认是空的方法
-// System.out.println(i);
-// System.out.println("ThreadPool exit!");
-// System.out.println("AtomicInteger total cost time: "+(System.currentTimeMillis()-b)+"ms.");
-// }
-// };
-//
-// for(int i=0;i<10;++i) {
-// es.submit(new AtomicDemo(0));
-// }
-// es.shutdown();
-
-
- long b=System.currentTimeMillis();
- ExecutorService es=new ThreadPoolExecutor(10,10,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) {
- @Override
- protected void beforeExecute(Thread t, Runnable r) {
- super.beforeExecute(t, r);//默认是空的方法
-
- }
- @Override
- protected void afterExecute(Runnable r, Throwable t) {
- super.afterExecute(r, t);
-
- }
- @Override
- protected void terminated() {
- super.terminated();//默认是空的方法
- System.out.println(k);
- System.out.println("ThreadPool exit!");
- System.out.println("ReentrantLock total cost time: "+(System.currentTimeMillis()-b)+"ms.");
- }
- };
-
- for(int i=0;i<10;++i) {
- es.submit(new AtomicDemo(1));
- }
- es.shutdown();
-
-
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo2.java b/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo2.java
deleted file mode 100644
index b72404a..0000000
--- a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo2.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xycode.LockWork;
-
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-
-/*
- * 直接对普通对象进行Atomic封装
- * AtomicIntegerFieldUpdate
- * AtomicLongFieldUpdate
- * AtomicReferenctFieldUpdate
- */
-public class AtomicDemo2 {
- static class Candidate{
- int id;
- volatile int score;
- public Candidate(int id, int score) {
- super();
- this.id = id;
- this.score = score;
- }
-
- }
-
- static final AtomicIntegerFieldUpdater scoreUpdater
- =AtomicIntegerFieldUpdater.newUpdater(Candidate.class, "score");//反射机制Candidate.score
- static AtomicInteger total_score=new AtomicInteger(0);
-
- public static void main(String[] args) throws InterruptedException {
- final Candidate stu=new Candidate(1,0);
- Thread[] t=new Thread[10000];
- for(int i=0;i<10000;++i) {
- t[i]=new Thread() {
- public void run() {
- if(Math.random()>0.4) {
- scoreUpdater.incrementAndGet(stu);
- total_score.incrementAndGet();
- }
- }
- };
- t[i].start();//调用start方法但是调用该方法只是准备线程并不是马上启动
- }
- for(int i=0;i<10000;++i) t[i].join();
- System.out.println("score = "+stu.score);
- System.out.println("total score = "+total_score);
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/LockWork/ThreadLocalDemo.java b/MultiThread_demo/src/com/xycode/LockWork/ThreadLocalDemo.java
deleted file mode 100644
index d516447..0000000
--- a/MultiThread_demo/src/com/xycode/LockWork/ThreadLocalDemo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.xycode.LockWork;
-/**
- * ThreadLocal,一种通过给每个线程生成局部数据来避免全局数据资源竞争的方法.
- * 实践证明,传统的直接在累内声明局部的数据成员也能达到相同的效果,性能也基本一致.
- * 所以说,ThreadLocal相比传统的方法更多的是起到了将数据解耦的作用.
- *
- */
-import java.util.Random;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-public class ThreadLocalDemo{
- static final int GEN_COUNT=10000000;
- static final int THREAD_COUNT=4;
- static ExecutorService es=Executors.newFixedThreadPool(THREAD_COUNT);
- static Random r=new Random(1234);
-
- static ThreadLocal tr=new ThreadLocal() {//ThreadLocal model,为每个线程生成一个本地数据,避免锁竞争
- protected Random initialValue() {
- return new Random(1234);
- }
- };
-
- static class MyTask implements Callable{
- int mode;
- Random my_r;
- public MyTask(int mode) {
- super();
- this.mode = mode;
- this.my_r=new Random(1234);
- }
-
- @Override
- public Long call(){
- long b=System.currentTimeMillis();
- for(int i=0;i[] f=new Future[THREAD_COUNT];//future model
- for(int i=0;i re=null;
-
- public AskThread(CompletableFuture re) {
- super();
- this.re = re;
- }
-
- @Override
- public void run() {
- int result=0;
- try {
- result=re.get()*re.get();
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
- System.out.println(result);
- }
- }
-
- public static int calc(int para) {
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return para*para;
- }
-
- public static int div(int a,int b) {
- return a/b;
- }
-
- public static void f() {
- ;
- }
-
- public static void main(String[] args) throws InterruptedException, ExecutionException {
-// /*
-// * 1.构造一个CompletableFuture实例
-// * 2.新建一个线程,将CompletableFuture实例作为参数,然后执行(run()里面需要Future.get())
-// */
-// final CompletableFuture fu=new CompletableFuture<>();
-// new Thread(new AskThread(fu)).start();
-// System.out.println("sleep...");
-// Thread.sleep(2000);
-// fu.complete(100);//填充数据(对应get())
-//// fu.complete(200);
-
-
-// //更简便的写法
-// final CompletableFuture fu=CompletableFuture.supplyAsync(()->calc(100));
-// /*
-// * CompletableFuture supplyAsync(Supplier supplier)
-// * Supplier是一个函数接口
-// *
-// * @FunctionalInterface
-// public interface Supplier {
-// T get();
-// }
-// Functional Interface: 这是一个功能界面,可以用作lambda表达式或方法引用的赋值对象。
-// */
-// System.out.println("calculating...");
-// System.out.println(fu.get());
-
-
- //CompletableFuture的异常处理,流式调用
- CompletableFuture fu=CompletableFuture//虽然div有返回值,但是经过一系列的流式调用后,就没有返回值了
- .supplyAsync(()->div(12,0))
- .exceptionally(exception->{
- exception.printStackTrace();
- return 0;
- })
- .thenApply(i->Integer.toString(i))
- .thenApply(str->("\""+str+"\""))
- .thenAccept(System.out::println);
- System.out.println(fu.get());//fu.get()返回null,实际上返回值为void(或者叫无返回值)是不能打印的
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ParallelJava8/FunctionalProgarmmingDemo1.java b/MultiThread_demo/src/com/xycode/ParallelJava8/FunctionalProgarmmingDemo1.java
deleted file mode 100644
index d38de6f..0000000
--- a/MultiThread_demo/src/com/xycode/ParallelJava8/FunctionalProgarmmingDemo1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.xycode.ParallelJava8;
-
-import java.util.Arrays;
-
-public class FunctionalProgarmmingDemo1 {
-
- public static void main(String[] args) {
- int[] arr= {1,2,3,4,5};
- Arrays.stream(arr).map(x->x+1).forEach(System.out::print);
- System.out.println();
- Arrays.stream(arr).forEach(System.out::print);//函数式编程几乎不会改变所传递的对象,这天然适合并行化
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAccumulatorDemo.java b/MultiThread_demo/src/com/xycode/ParallelJava8/LongAccumulatorDemo.java
deleted file mode 100644
index 55da4c8..0000000
--- a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAccumulatorDemo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.xycode.ParallelJava8;
-
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.LongAccumulator;
-
-public class LongAccumulatorDemo {
-
- public static void main(String[] args) {
- LongAccumulator accumulator=new LongAccumulator(Long::max, Long.MIN_VALUE);//指定操作的函数和初始值
- ExecutorService es=Executors.newCachedThreadPool();
- for(int i=0;i<10000;++i) {
- es.submit(new Thread(
- ()->{
- Random r=new Random();
- accumulator.accumulate(r.nextLong());
- }
- ));
- }
- es.shutdown();
- System.out.println(accumulator.get());
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAdderDemo.java b/MultiThread_demo/src/com/xycode/ParallelJava8/LongAdderDemo.java
deleted file mode 100644
index cb31b1e..0000000
--- a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAdderDemo.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package com.xycode.ParallelJava8;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.LongAdder;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class LongAdderDemo {
- static final int MAX_THREAD=10;
- static final int TASK_COUNT=10;
- static final int TARGET_COUNT=10000000;
- ReentrantLock lock=new ReentrantLock();
- long count=0;//普通的加锁同步
- AtomicLong acount=new AtomicLong(0);//原子同步
- LongAdder lacount=new LongAdder();//LongAdder同步(原理:基于原子同步的热点分离)
-
-
- static CountDownLatch cdlsync=new CountDownLatch(TASK_COUNT);//等待指定的线程完成(倒计数器)
- static CountDownLatch cdlatomic=new CountDownLatch(TASK_COUNT);
- static CountDownLatch cdladder=new CountDownLatch(TASK_COUNT);
-
- static class SyncThread implements Runnable{
- String name;
- long start;
- LongAdderDemo out;
-
- public SyncThread(String name, long start, LongAdderDemo out) {
- super();
- this.name = name;
- this.start = start;
- this.out = out;
- }
-
- @Override
- public void run() {
-
- for(int i=0;i{
-
- static final int THRESHOLD=10000;
- long start,end;
-
- public ForkAndJoin(long start, long end) {
- super();
- this.start = start;
- this.end = end;
- }
-
- @Override
- protected Long compute() {
- long sum=0;
- if(end-start subTasks=new ArrayList<>();
- long pos=start;
- for(int i=0;i<100;++i) {//分割成100个子任务
- long lastOne=pos+start;
- if(lastOne>end) lastOne=end;
- ForkAndJoin subtask=new ForkAndJoin(pos, lastOne);
- pos+=step+1;
- subTasks.add(subtask);
- subtask.fork();
- }
- for(ForkAndJoin t:subTasks) {
- sum+=t.join();//Returns:the computed result
- }
- }
- return sum;
- }
-
- public static void main(String[] args) {
- ForkJoinPool pool=new ForkJoinPool();
- ForkAndJoin task=new ForkAndJoin(0, 200000);
- ForkJoinTask result=pool.submit(task);//future模式
- try {
- System.out.println("sum = "+result.get());
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReadWriteLock.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReadWriteLock.java
deleted file mode 100644
index 3faea0f..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ReadWriteLock.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.xycode.ThreadWork;
-import java.util.Random;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-/*
- * 1.ReentrantReadWriteLock(读写(重入)锁)能使读操作与读操作之间并行,因为读操作与读操作之间没有数据一致性的问题,
- * 读操作与写操作,写操作与写操作之间能必须同步,此时读写锁就相当于普通的锁,
- * 2.在读操作的次数远大于写操作是,读写锁能带来极大的性能提升.
- * 3.实践证明,join()会使这玩意失灵....
- */
-public class ReadWriteLock {
- static Lock lock=new ReentrantLock();
- static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock();
- static Lock readLock=readWriteLock.readLock();
- static Lock writeLock=readWriteLock.writeLock();
- int val;
- public Object handleRead(Lock lock) {
- try {
- lock.lock();
- Thread.sleep(1000);//模拟一个耗时的读操作
- System.out.println(val);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- lock.unlock();
- }
- return val;
- }
-
- public void handleWrite(Lock lock,int data) {
-
- try {
- lock.lock();
- Thread.sleep(1000);//模拟一个耗时的写操作
- val=data;
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- lock.unlock();
- }
-
- }
-
- public static void main(String[] args) throws InterruptedException {
- final ReadWriteLock demo=new ReadWriteLock();
- Runnable readRunnable=new Runnable() {
- @Override
- public void run() {
- demo.handleRead(readLock);
-// demo.handleRead(lock);
- }
- };
- Runnable writeRunnable=new Runnable() {
- @Override
- public void run() {
- demo.handleWrite(writeLock,new Random().nextInt(100));
-// demo.handleRead(lock,new Random().nextInt(100));
- }
- };
-// long begin=System.currentTimeMillis();
-// for(int i=0;i<10;++i) {
-// if(i<8) {
-// Thread t=new Thread(readRunnable);
-// t.start();
-// t.join();//main线程要等待t线程执行结束
-// }
-// else {
-// Thread t=new Thread(writeRunnable);
-// t.start();
-// t.join();
-// }
-// }
-// System.out.println("consume time: "+(System.currentTimeMillis()-begin)/1000+"s");
-
- for(int i=0;i<2;++i) {
- Thread t=new Thread(writeRunnable);
- t.start();
- }
-
- for(int i=0;i<18;++i) {
- Thread t=new Thread(readRunnable);
- t.start();
- }
-
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockAndCondition.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockAndCondition.java
deleted file mode 100644
index d4d6bd6..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockAndCondition.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.xycode.ThreadWork;
-/*
- * Condition[await(),signal()]一般和ReentrantLock[lock(),unlock()]搭配使用
- * await(),signal()的作用类似于wait(),notify()
- */
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class ReentrantLockAndCondition implements Runnable{
- static ReentrantLock lock=new ReentrantLock();
- static Condition condition=lock.newCondition();
-
- @Override
- public void run() {
-
- try {
- lock.lock();
- System.out.println("Thread-"+Thread.currentThread().getId()+" is waitting...");
- condition.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- lock.unlock();
- System.out.println("Thread-"+Thread.currentThread().getId()+" exit!");
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
- Thread t1=new Thread(new ReentrantLockAndCondition());
- t1.start();
- t1.sleep(2000);
-
- lock.lock();
- condition.signal();//必须持有锁(与condition关联的lock)才可以signal
- lock.unlock();
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo1.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo1.java
deleted file mode 100644
index 241feb7..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo1.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.locks.ReentrantLock;
-
-public class ReentrantLockDemo1 implements Runnable{
- //ReentrantLock(boolean fair),默认非公平,fair==true时,代表公平锁,其性能相比非公平锁较差
- public static ReentrantLock lock=new ReentrantLock(false);//重入锁,unlock与lock的次数要一致
- public static int i;
- @Override
- public void run() {
- for(int j=0;j<1e6;++j) {
- try {
- lock.lock();
- lock.lock();//加锁
- ++i;
- }finally {
- lock.unlock();//释放锁
- lock.unlock();
- }
-
- }
-
- }
- public static void main(String[] args) throws InterruptedException {
- Thread t1=new Thread(new ReentrantLockDemo1());
- Thread t2=new Thread(new ReentrantLockDemo1());
- t1.start();t2.start();
- t1.join();t2.join();//join须在start之后
-
- System.out.println(i);
-
- }
-
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo2.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo2.java
deleted file mode 100644
index 5a80c5c..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo2.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.locks.ReentrantLock;
-
-public class ReentrantLockDemo2 implements Runnable{
- static ReentrantLock lock1=new ReentrantLock();
- static ReentrantLock lock2=new ReentrantLock();
- int lock_flag;
-
- public ReentrantLockDemo2(int lock_flag) {
- super();
- this.lock_flag = lock_flag;
- }
-
- @Override
- public void run() {
- if(lock_flag==1) {
- try {
- lock1.lockInterruptibly();//lock,优先响应中断,可以通过发送中断信号来解除死锁
- Thread.sleep(500);//这里sleep,使线程更容易产生死锁
- lock2.lockInterruptibly();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }else {
- try {
- lock2.lockInterruptibly();
- Thread.sleep(500);
- lock1.lockInterruptibly();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- if(lock1.isHeldByCurrentThread()) lock1.unlock();
- if(lock2.isHeldByCurrentThread()) lock2.unlock();
- System.out.println("Thread-"+Thread.currentThread().getId()+" exit!");
- }
-
- public static void main(String[] args) throws InterruptedException {
- Thread t1=new Thread(new ReentrantLockDemo2(1));
- Thread t2=new Thread(new ReentrantLockDemo2(2));
- t1.start();t2.start();
- Thread.sleep(1000);
- t2.interrupt();//t2线程被中断,t2将会放弃对锁的申请,并且释放已持有的锁
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo.java b/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo.java
deleted file mode 100644
index 081ba7a..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.xycode.ThreadWork;
-/*
- * synchronized(object):给指定对象加锁
- * synchronized returnType function(argv):给实例方法加锁,相当于给实例对象加锁(synchronized(this){}单个实例对象互斥)
- * synchronized static returnType function(argv):给静态方法加锁,相当于给类加锁(synchronized(object.class){})(相同类不同的实例对象也是互斥的)
- */
-public class SynchronizedDemo implements Runnable{
- public static int i=0;
- static SynchronizedDemo instance=new SynchronizedDemo();
- public static synchronized void inc() {//给实例方法加锁
- ++i;
- }
-// public synchronized void inc() {//给静态实例方法加锁
-// ++i;
-// }
- @Override
- public void run() {
- for(int j=0;j<10e6;++j) {
-// synchronized (instance) {
-// ++i;
-// }
-
-// synchronized (this) {
-// ++i;
-// }
-
- //static synchronized method实际上与synchronized(object.class)等价
- inc();
-// synchronized (SynchronizedDemo.class) {
-// ++i;
-// }
-
- }
-
- }
- public static void main(String[] args) throws InterruptedException {
- SynchronizedDemo s=new SynchronizedDemo();
- Thread t1=new Thread(s);
- Thread t2=new Thread(s);
- t1.start();t2.start();
- t1.join();t2.join();//join须在start之后
-
- System.out.println(i);
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo2.java b/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo2.java
deleted file mode 100644
index 4b74b0e..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo2.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.xycode.ThreadWork;
-
-public class SynchronizedDemo2 implements Runnable{
-
- public static Integer i=0;
- public static SynchronizedDemo2 o=new SynchronizedDemo2();
- @Override
- public void run() {
- for(int j=0;j<10e6;++j) {
- synchronized (o) {
- ++i;
- }
-
-// synchronized (i) {//错误的做法,因为Integer本身是不变的,++i导致i的指向不断改变,因此会产生不一致的问题,可能加锁加到了不一样的对象实例上
-// ++i;
-// }
-
- }
-
- }
- public static void main(String[] args) throws InterruptedException {
- Thread t1=new Thread(o);
- Thread t2=new Thread(o);
- t1.start();t2.start();
- t1.join();t2.join();//join须在start之后
-
- System.out.println(i);
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolDemo.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolDemo.java
deleted file mode 100644
index 4915fd2..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolDemo.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-/*
- * ScheduledThreadPool:针对计划任务
- */
-public class ThreadPoolDemo {
-
- public static void main(String[] args) {
- ScheduledExecutorService ses=Executors.newScheduledThreadPool(10);//poolSize=10
- ses.scheduleAtFixedRate(new Runnable() {
- //scheduleAtFixedRate:
- //2s一个周期,初试延时为0,
- //若任务执行时间超过了周期,則上一个任务结束后会立即执行,不会再延时.
- @Override
- public void run() {
- try {
- Thread.sleep(3000);
- System.out.println(System.currentTimeMillis()/1000%1009);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- }, 0, 2, TimeUnit.SECONDS);
-
-// ses.schedule(new Runnable() {
-// //schedule:
-// //指定延时,然后执行
-// @Override
-// public void run() {
-// try {
-// Thread.sleep(3000);
-// System.out.println(System.currentTimeMillis()/1000%1009);
-// } catch (InterruptedException e) {
-// e.printStackTrace();
-// }
-//
-// }
-// }, 3, TimeUnit.SECONDS);
-
-// ses.scheduleWithFixedDelay(new Runnable() {
-// //scheduleWithFixedDelay:
-// //2s一个周期,初试延时为0,不再是单纯的周期性,实质上是在每个任务结束后插入一个延时(period)
-// //若任务执行时间超过了周期,則上一个任务结束后仍会插入延时(period),不会再延时.
-// @Override
-// public void run() {
-// try {
-// Thread.sleep(3000);
-// System.out.println(System.currentTimeMillis()/1000%1009);
-// } catch (InterruptedException e) {
-// e.printStackTrace();
-// }
-//
-// }
-// }, 0, 2, TimeUnit.SECONDS);
-
- //线程池若不shutdown,将不会自行退出
- //ses.shutdown();//拒绝接受新的任务,并且等待线程池中的任务执行完毕后就退出.
- //ses.shutdownNow();//线程池拒绝接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行直接退出,慎用!!!
-
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolExtend.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolExtend.java
deleted file mode 100644
index deaa885..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolExtend.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-public class ThreadPoolExtend {
- static class MyTask implements Runnable{
- String name;
-
- public MyTask(String name) {
- super();
- this.name = name;
- }
-
- @Override
- public void run() {
- System.out.println("Excuting Thread-"+name+".");
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- }
- public static void main(String[] args) throws InterruptedException {
- ExecutorService es=new ThreadPoolExecutor(5,10,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) {
- @Override
- protected void beforeExecute(Thread t, Runnable r) {
- super.beforeExecute(t, r);//默认是空的方法
- System.out.println("准备执行 "+((MyTask)r).name+".");
-
- }
- @Override
- protected void afterExecute(Runnable r, Throwable t) {
- super.afterExecute(r, t);
- System.out.println(((MyTask)r).name+"执行完成.");
- }
- @Override
- protected void terminated() {
- super.terminated();
- System.out.println("ThreadPool exit!");
- }
- };
- for(int i=0;i<10;++i) {
- es.execute(new MyTask("Task-"+(i+1)));
- Thread.sleep(100);
- }
- es.shutdown();
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolFactory.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolFactory.java
deleted file mode 100644
index d1456ab..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.RejectedExecutionHandler;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-public class ThreadPoolFactory {
- static class MyTask implements Runnable{
-
- @Override
- public void run() {
- System.out.println(System.currentTimeMillis()/1000+" : Thread-"+Thread.currentThread().getId());
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- }
- public static void main(String[] args) throws InterruptedException {
- ExecutorService es=new ThreadPoolExecutor(5,//corePoolSize
- 10,//maximumPoolSize
- 0,//线程池中线程数量超过corePoolSize但小于maximumPoolSize,多余的线程保持存活的时间
- TimeUnit.SECONDS,//存活时间的时间单位
- new SynchronousQueue<>(),//任务队列,存放被提交但未执行的任务
- new ThreadFactory() {//创建线程的工厂
-
- @Override
- public Thread newThread(Runnable r) {
- Thread t=new Thread(r);
- t.setDaemon(true);
- System.out.println("create Thread-"+t.getId());
- return t;
- }
- },
- new RejectedExecutionHandler() {//自定义拒绝策略,当线程池中线程数量超过maximumPoolSize时执行的拒绝策略
-
- @Override
- public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
- System.out.println("Thread-"+new Thread(r).getId()+" is rejected.");
- }
- }
- );
-
- for(int i=0;i<20;++i) {
- es.submit(new MyTask());
- }
- //因为线程池中的线程都设置为守护现场,所以在非守护线程main没有结束之前,线程池也一直不会退出
- //线程池等待main线程休眠3s之后才退出
- Thread.sleep(3000);
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolRejectDemo.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolRejectDemo.java
deleted file mode 100644
index 6275cd3..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolRejectDemo.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.RejectedExecutionHandler;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-public class ThreadPoolRejectDemo {
- static class MyTask implements Runnable{
-
- @Override
- public void run() {
- System.out.println(System.currentTimeMillis()/1000+" : Thread-"+Thread.currentThread().getId());
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- }
-
- public static void main(String[] args) throws InterruptedException {
- ExecutorService es=new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingDeque(10),
- new RejectedExecutionHandler() {//自定义拒绝策略
-
- @Override
- public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
- System.out.println(r.toString()+" is discard.");
- }
- });
- for(int i=0;i<10e5;++i) {
- es.submit(new MyTask());
- Thread.sleep(10);//10ms提交一个任务,但是100ms才能执行完一个任务,最终必将超出线程池的处理能力,从而执行reject策略.
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolTrace.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolTrace.java
deleted file mode 100644
index a163c56..0000000
--- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolTrace.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.xycode.ThreadWork;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-public class ThreadPoolTrace{
- static class DivTask implements Runnable{
- int a,b;
-
- public DivTask(int a, int b) {
- super();
- this.a = a;
- this.b = b;
- }
-
- @Override
- public void run() {
- System.out.println(a/b);
- }
-
- }
- public static void main(String[] args) {
- //ThreadPoolExecutor(C) extends AbstractExecutorService(C)
- //AbstractExecutorService(C) implements ExecutorService(I)
- //interface(I) ExecutorService extends Executor(I)
- //public interface Executor { void execute(Runnable command); }
-
-// ExecutorService es=new ThreadPoolExecutor(5, 20,
-// 0, TimeUnit.SECONDS,
-// new LinkedBlockingDeque());
-
- ThreadPoolExecutor es=new ThreadPoolExecutor(5, 20,
- 0, TimeUnit.SECONDS,
- new LinkedBlockingDeque());
- for(int i=0;i<5;++i) {
- try {
- es.submit(new DivTask(100, i)).get();
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/actor/ActiveObject.java b/MultiThread_demo/src/com/xycode/actor/ActiveObject.java
deleted file mode 100644
index 565a892..0000000
--- a/MultiThread_demo/src/com/xycode/actor/ActiveObject.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.xycode.actor;
-
-import java.util.concurrent.Future;
-
-public interface ActiveObject {
- //接口里面定义的方法默认是abstract的
- public Future makeStr(int cnt,char fillChar);
- public void displayStr(String str);
- public void shutdown();
-
-}
diff --git a/MultiThread_demo/src/com/xycode/actor/ActiveObjectFactory.java b/MultiThread_demo/src/com/xycode/actor/ActiveObjectFactory.java
deleted file mode 100644
index a764302..0000000
--- a/MultiThread_demo/src/com/xycode/actor/ActiveObjectFactory.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.xycode.actor;
-
-public class ActiveObjectFactory {
- public static ActiveObject createActiveObject() {
- return new ActiveObjectImpl();
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/actor/ActiveObjectImpl.java b/MultiThread_demo/src/com/xycode/actor/ActiveObjectImpl.java
deleted file mode 100644
index cf650c0..0000000
--- a/MultiThread_demo/src/com/xycode/actor/ActiveObjectImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.xycode.actor;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.RejectedExecutionException;
-
-public class ActiveObjectImpl implements ActiveObject{
- private final ExecutorService es=Executors.newCachedThreadPool();
-
- @Override
- public Future makeStr(int cnt, char fillChar) throws RejectedExecutionException {
-
- //Future模式,submit()先返回一个凭证
- return es.submit(new Callable() {
-
- @Override
- public String call() {
- char[] buf=new char[cnt];
- for(int i=0;i shareQueue=MakerClient.getSharequeue();
- private final ActiveObject activeObject;
- public DisplayClient(String name,ActiveObject activeObject) {
- super(name);
- this.activeObject=activeObject;
- }
-
- @Override
- public void run() {
- try {
- for(int i=0;true;++i) {
- String str=Thread.currentThread().getName()+"--"+(i+1);
- activeObject.displayStr(str+", displayStr = "+shareQueue.take());
- Thread.sleep(200);
- }
- }catch (RejectedExecutionException e) {
- System.out.println(Thread.currentThread().getName()+" displayTask : "+e);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/actor/Main.java b/MultiThread_demo/src/com/xycode/actor/Main.java
deleted file mode 100644
index fc2df9d..0000000
--- a/MultiThread_demo/src/com/xycode/actor/Main.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.xycode.actor;
-
-public class Main {
-
- public static void main(String[] args) {
- ActiveObject activeObject=ActiveObjectFactory.createActiveObject();
- new MakerClient("Alice", activeObject).start();
- new MakerClient("Bob", activeObject).start();
- new DisplayClient("Charis", activeObject).start();
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- activeObject.shutdown();//shutdown后再submit/execute任务就会抛出RejectedExecutionException
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/actor/MakerClient.java b/MultiThread_demo/src/com/xycode/actor/MakerClient.java
deleted file mode 100644
index c5383de..0000000
--- a/MultiThread_demo/src/com/xycode/actor/MakerClient.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.xycode.actor;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionException;
-
-public class MakerClient extends Thread{
- private static final LinkedBlockingQueue shareQueue=new LinkedBlockingQueue<>();
- private final ActiveObject activeObject;
- private final char fillChar;
-
-
- public static LinkedBlockingQueue getSharequeue() {
- return shareQueue;
- }
-
- public MakerClient(String name,ActiveObject activeObject) {
- super(name);
- this.activeObject=activeObject;
- this.fillChar=name.charAt(0);
- }
-
- @Override
- public void run() {
- try {
- for(int i=0;true;++i) {
- Future future=activeObject.makeStr(i+1, fillChar);
- Thread.sleep(10);
- String val=future.get();
- System.out.println(Thread.currentThread().getName()+"--"+(i+1)+", makeStr = "+val);
- shareQueue.add(val);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (RejectedExecutionException e) {
- System.out.println(Thread.currentThread().getName()+" makeTask : "+e);
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/DisruptorDemo.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/DisruptorDemo.java
deleted file mode 100644
index 5421c64..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/DisruptorDemo.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-
-import java.nio.ByteBuffer;
-import java.text.MessageFormat;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import com.lmax.disruptor.EventFactory;
-import com.lmax.disruptor.RingBuffer;
-import com.lmax.disruptor.WorkHandler;
-import com.lmax.disruptor.dsl.Disruptor;
-public class DisruptorDemo {
- static class PCData{
- long value;
-
- public long getValue() {
- return value;
- }
-
- public void setValue(long value) {
- this.value = value;
- }
-
- }
-
- static class PCDataFactory implements EventFactory{
- @Override
- public PCData newInstance() {
- return new PCData();
- }
-
- }
-
- static class Producer{
- RingBuffer ringBuffer;
-
- public Producer(RingBuffer ringBuffer) {
- super();
- this.ringBuffer = ringBuffer;
- }
-
- public void pushData(ByteBuffer bb) {
- long sequence=ringBuffer.next();//Increment and return the next sequence for the ring buffer
- PCData event=ringBuffer.get(sequence);
- event.setValue(bb.getLong(0));//index=0,开始读取的索引
- ringBuffer.publish(sequence);
- }
-
- }
-
- static class Comsumer implements WorkHandler{
-
- @Override
- public void onEvent(PCData event) throws Exception {
- System.out.print("Consumer-Thread-"+Thread.currentThread().getId()+" start, ");
- System.out.println(MessageFormat.format("Compute {0}*{1}={2}",
- event.getValue(),event.getValue(),event.getValue()*event.getValue()));
- }
-
- }
-
-
- public static void main(String[] args) throws InterruptedException {
- ExecutorService es=Executors.newCachedThreadPool();
- PCDataFactory factory=new PCDataFactory();
- int bufferSize=2048;
- Disruptor disruptor=new Disruptor<>(factory, bufferSize, es);
- disruptor.handleEventsWithWorkerPool(
- new Comsumer(),new Comsumer(),new Comsumer(),new Comsumer());
- disruptor.start();
-
- RingBuffer ringBuffer=disruptor.getRingBuffer();//disruptor处理Consumer线程
- ByteBuffer bb=ByteBuffer.allocate(8);//8个字节,刚好是Long类型所占的字节长度
- Producer producer=new Producer(ringBuffer);//ringBuffer将Producer和Consumer关联起来
- for(int i=0;i<100;++i) {
- System.out.println("Producer add data "+i);
- bb.putLong(0,i);//往ByteBuffer里添加long类型的数据(值为i),long占8 byte
- producer.pushData(bb);
- Thread.sleep(50);
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/FutureDemo.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/FutureDemo.java
deleted file mode 100644
index 196beb9..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/FutureDemo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-/**
- * Future模式的实现
- * @author xycode
- *
- */
-public class FutureDemo {
- static interface Data{
- public String getResult();
- }
- static class RealData implements Data{
- String result;
- public RealData(String para,int count) {//真实数据,生成的速度较慢
- if(count<0) {
- throw new NegativeArraySizeException(String.valueOf(count));
- }
- StringBuffer sb=new StringBuffer();
- for(int i=0;i{
- String para;
- public RealData(String para) {
- super();
- this.para = para;
- }
-
- @Override
- public String call() throws Exception {
- StringBuffer sb=new StringBuffer();
- for(int i=0;i<10;++i) {
- sb.append(para);
- Thread.sleep(100);
- }
- return sb.toString();
- }
-
- }
- public static void main(String[] args) throws InterruptedException, ExecutionException {
- FutureTask future1=new FutureTask<>(new RealData("xycode "));//jdk支持的future模式
- FutureTask future2=new FutureTask<>(new RealData("xycodec "));
- ExecutorService es=Executors.newCachedThreadPool();
- es.submit(future1);
- es.submit(future2);
- System.out.println("Request Finished!");
-
- //这里可以处理其它业务逻辑
- System.out.println("Handle Others...");
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("Handle Others Finished!");
-
- //jdk提供的future编程模式简便多了,带返回值的任务FutureTask (Callable),不带返回值的任务FutureTask (Runnable)
- System.out.println("Data = "+future1.get());//若数据还没算好,会在这儿一直等着,直到数据准备完毕
- System.out.println("Data = "+future2.get());
- es.shutdown();//拒绝后续任务的提交,在已有任务完成后线程池才会退出
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/LazySingleton.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/LazySingleton.java
deleted file mode 100644
index f6eb764..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/LazySingleton.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-
-public class LazySingleton {
-
- private LazySingleton() {//private的构造方法,避免外部调用多次创建
- System.out.println("LazySingleton is created.");
- }
- /**
- * 若instance非static,getInstance也非static,
- * 那么执行getInstance的前提是必须有一个Singleton的对象引用,这无疑产生了悖论,
- * 导致的后果是我们永远也无法获得这个对象实例
- *
- * 下面的方式是保证是第一次GetInstance()时创建对象,synchronized防止同时创建多次,但是也是性能下降了.
- */
- private static LazySingleton instance=null;
- /**
- * 实验证明,若去掉synchronized,当线程比较密集时,会多次创建
- *
- */
- public synchronized static LazySingleton GetInstance() {
- if(instance==null) return (instance=new LazySingleton());
- else return instance;
- }
-
- public static void main(String[] args) {
-// System.out.println(LazySingleton.GetInstance());
-
- //验证单例模式确实有效
- Thread[] t=new Thread[100];
- for(int i=0;i<100;++i) {
- t[i]=new Thread() {
- public void run() {
- try {
- System.out.println(LazySingleton.GetInstance());
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- };
- t[i].start();
- }
- for(int i=0;i<100;++i) {
- try {
- t[i].join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- System.out.println("end!");
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/MatrixMulTask.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/MatrixMulTask.java
deleted file mode 100644
index 62d1050..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/MatrixMulTask.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ForkJoinPool;
-import java.util.concurrent.ForkJoinTask;
-import java.util.concurrent.RecursiveTask;
-
-import org.jmatrices.dbl.Matrix;
-import org.jmatrices.dbl.MatrixFactory;
-import org.jmatrices.dbl.operator.MatrixOperator;
-
-public class MatrixMulTask extends RecursiveTask{//ForkAndJoin框架,RecursiveTask带有返回值的
- Matrix m1,m2;
- String pos;
- static final int Mul_granularity=8;
- public MatrixMulTask(Matrix m1, Matrix m2, String pos) {
- super();
- this.m1 = m1;
- this.m2 = m2;
- this.pos = pos;
- }
-
- @Override
- protected Matrix compute() {
- //不断地将大的矩阵分解为小的矩阵相乘,并为每个小矩阵相乘fork一个线程来计算
- if(m1.rows()<=Mul_granularity||m2.cols()<=Mul_granularity) {
- return MatrixOperator.multiply(m1, m2);
- }else {
- //行数rows,列数cols
- Matrix m11=m1.getSubMatrix(1, 1, m1.rows()/2, m1.cols());//矩阵m1的上半部分
- Matrix m12=m1.getSubMatrix(m1.rows()/2+1, 1, m1.rows(), m1.cols());//矩阵m1的下半部分
-
- Matrix m21=m2.getSubMatrix(1, 1, m2.rows(), m2.cols()/2);//矩阵m2的左半部分
- Matrix m22=m2.getSubMatrix(1, m2.cols()/2+1, m2.rows(), m2.cols());//矩阵m2的左半部分
-
- ArrayList subTasks=new ArrayList<>();
- subTasks.add(new MatrixMulTask(m11, m21, "m1"));
- subTasks.add(new MatrixMulTask(m11, m22, "m2"));
- subTasks.add(new MatrixMulTask(m12, m21, "m3"));
- subTasks.add(new MatrixMulTask(m12, m22, "m4"));
-
- for(MatrixMulTask t:subTasks) {
- t.fork();//fork一个线程来计算
- }
-
- Map matrix_result=new HashMap<>();//String原生支持Hash与equals,不用重载了
- for(MatrixMulTask t:subTasks) {
- matrix_result.put(t.pos, t.join());//join返回就算结果,根据pos来确定是那块计算结果
- }
-
- Matrix tmp1=MatrixOperator.horizontalConcatenation(matrix_result.get("m1"), matrix_result.get("m2"));//水平方向合并矩阵
- Matrix tmp2=MatrixOperator.horizontalConcatenation(matrix_result.get("m3"), matrix_result.get("m4"));
-
- Matrix result=MatrixOperator.verticalConcatenation(tmp1, tmp2);//垂直方向合并矩阵,得到真正的结果
- return result;
- }
- }
-
- public static void main(String[] args) {
- ForkJoinPool pool=new ForkJoinPool();
- Matrix m1=MatrixFactory.getRandomMatrix(512, 256, null);
- Matrix m2=MatrixFactory.getRandomMatrix(256, 512, null);
- MatrixMulTask task=new MatrixMulTask(m1,m2,null);
- ForkJoinTask result=pool.submit(task);//future模式
- try {
- System.out.println(result.get());
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelPipeline.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelPipeline.java
deleted file mode 100644
index d6d589b..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelPipeline.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-/*
- * 并行流水线,将任务分解,交给不同的线程执行(线程之间有处理逻辑上的先后关系),提高性能
- */
-import java.text.MessageFormat;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingDeque;
-
-public class ParallelPipeline {
- static class Msg{
- double i,j;
- String str;
- public Msg(double i, double j, String str) {
- super();
- this.i = i;
- this.j = j;
- this.str = str;
- }
-
- }
-
- static class Plus implements Runnable{
- static BlockingQueue bq=new LinkedBlockingDeque<>();
-
- @Override
- public void run() {
- while(true) {
- try {
- Msg msg=bq.take();
- msg.j=msg.i+msg.j;
- Multiply.bq.add(msg);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- }
- }
-
- static class Multiply implements Runnable{
- static BlockingQueue bq=new LinkedBlockingDeque<>();
-
- @Override
- public void run() {
- while(true) {
- try {
- Msg msg=bq.take();
- msg.i=msg.i*msg.j;
- Div.bq.add(msg);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- }
- }
-
- static class Div implements Runnable{
- static BlockingQueue bq=new LinkedBlockingDeque<>();
-
- @Override
- public void run() {
- while(true) {
- try {
- Msg msg=bq.take();
- msg.i=msg.i/2;
- System.out.println(msg.str+" = "+msg.i);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- }
- }
-
- public static void main(String[] args) {
- new Thread(new Plus()).start();
- new Thread(new Multiply()).start();
- new Thread(new Div()).start();
-
- for(int i=0;i<1000;++i) {
- for(int j=0;j<1000;++j) {
- Msg msg=new Msg(i, j, MessageFormat.format("({0}+{1})*{2}/2",i,j,i));
- Plus.bq.add(msg);
- }
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelSearch.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelSearch.java
deleted file mode 100644
index 58985dc..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelSearch.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-/**
- * 并行搜索,先将序列分段,每段分配一个线程去搜索
- */
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicInteger;
-
-
-public class ParallelSearch {
- static AtomicInteger result=new AtomicInteger(-1);//原子类
- static final int Thread_num=10;
- static ExecutorService es=Executors.newCachedThreadPool();
- static int[] arr;
- static class SearchTask implements Callable{
- int begin,end,searchValue;
-
- public SearchTask(int searchValue,int begin, int end) {
- super();
- this.begin = begin;
- this.end = end;
- this.searchValue = searchValue;
- }
-
- @Override
- public Integer call() throws Exception {
- return search(searchValue, begin, end);
- }
-
- }
- public static int search(int searchValue,int begin,int end) {//返回值所在的索引
- for(int i=begin;i=0) return result.get();
- if(arr[i]==searchValue) {
- if(result.compareAndSet(-1, i)==false) {//CAS模式操作
- return result.get();
- }else {
- return i;
- }
- }
- }
- return -1;//没找到,就返回-1
- }
-
- public static int pSearch(int searchValue) throws InterruptedException, ExecutionException {
- int subSize=arr.length/Thread_num+1;
- List> re=new ArrayList<>();//子任务的返回值的凭证,Future模式
- for(int i=0;i=arr.length) end=arr.length;
- //submit有返回值,为Future,提交到线程池中去计算
- re.add(es.submit(new SearchTask(searchValue,i, end)));
- }
- for(Future fu:re) {
- if(fu.get()>=0) return fu.get();//get(),Future模式,根据先前的凭证去请求计算的结果,若没计算好,就会一直等待
- }
- return -1;
- }
-
- public static void main(String[] args) throws InterruptedException, ExecutionException {
- Random r=new Random();
- arr=new int[2000000];
- for(int i=0;i<2000000;++i) {
- arr[i]=r.nextInt(2000000);
- }
- for(int i=0;i<100;++i) {
- int searchValue=r.nextInt(2000000);
- System.out.println("searchValue = "+searchValue+", pos = "+pSearch(searchValue));
- result=new AtomicInteger(-1);//搜索一次后要及时清除状态
- }
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ProducerAndConsumer.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ProducerAndConsumer.java
deleted file mode 100644
index 26e9395..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ProducerAndConsumer.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-
-import java.text.MessageFormat;
-import java.util.Random;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-
-public class ProducerAndConsumer {
- static class PCData{
- int data;
- public PCData(int data) {
- super();
- this.data = data;
- }
-
- public int getData() {
- return data;
- }
-
- public void setData(int data) {
- this.data = data;
- }
-
- @Override
- public String toString() {
- return "[data = "+data+"]";
- }
- }
- static class Producer implements Runnable{
- volatile boolean isRunning=true;
- BlockingQueue queue;//这里只是一个引用,因为是要和其它 线程/类 共享的
- static AtomicInteger count=new AtomicInteger(0);
- static final int sleep_time=1000;
-
-
- public Producer(BlockingQueue queue) {
- super();
- this.queue = queue;
- }
-
-
- @Override
- public void run() {
- PCData data=null;
- Random r=new Random();
- System.out.println("start,ProducerID = "+Thread.currentThread().getId());
- while(isRunning) {
- try {
- Thread.sleep(r.nextInt(sleep_time));
- data=new PCData(count.incrementAndGet());//相当于++count
- System.out.print("Producer: ");
- System.out.println(data+ "is put into queue.");
- if(queue.offer(data, 2, TimeUnit.SECONDS)==false) {
- System.out.println("failed to put "+data+" into queue.");
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
-// Thread.currentThread().interrupt();
- }
- }
- }
-
- public void stop() {
- isRunning=false;
- }
-
- }
-
- static class Consumer implements Runnable{
- BlockingQueue queue;//这里只是一个引用,因为是要和其它 线程/类 共享的
- static final int sleep_time=1000;
-
-
- public Consumer(BlockingQueue queue) {
- super();
- this.queue = queue;
- }
-
- @Override
- public void run() {
- System.out.println("start,ConsumerID = "+Thread.currentThread().getId());
- Random r=new Random();
- while(true) {
- try {
- PCData data=queue.take();
- if(data!=null) {
- int result=data.getData()*data.getData();
- System.out.print("Consumer: compute ");
- System.out.println(MessageFormat.format("{0}*{1}={2}",
- data.getData(),data.getData(),result));
- Thread.sleep(r.nextInt(sleep_time));
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
-// Thread.currentThread().interrupt();
- }
-
- }
- }
- }
- public static void main(String[] args) throws InterruptedException {
- BlockingQueue queue=new LinkedBlockingDeque<>(10);
- /*
- * 共享一个队列,这个队列就是联系Producer和Consumer的纽带
- * 并且由于有这个queue充当缓冲区,允许Producer和Consumer线程之间性能存在差异,起到一个调和的作用.
- */
- Producer p1=new Producer(queue);
- Producer p2=new Producer(queue);
- Producer p3=new Producer(queue);
-
- Consumer c1=new Consumer(queue);
- Consumer c2=new Consumer(queue);
- Consumer c3=new Consumer(queue);
-
- ExecutorService es=Executors.newCachedThreadPool();
- es.execute(p1);
- es.execute(p2);
- es.execute(p3);
-
- es.execute(c1);
- es.execute(c2);
- es.execute(c3);
- Thread.sleep(10000);//计算时间10s
-
- p1.stop();//Producer线程停止生产数据
- p2.stop();
- p3.stop();
-
- Thread.sleep(3000);
-// es.shutdown();//这里的shutdown其实没用,因为Consumer线程一直在运行,所以线程池只是停止接受任务,而不会退出
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/Singleton.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/Singleton.java
deleted file mode 100644
index b8382df..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/Singleton.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-/*
- * 单例模式
- *
- */
-
-
-public class Singleton {
- private Singleton() {//private的构造方法,避免外部调用多次创建
- System.out.println("Singleton is created.");
- }
- /**
- * 若instance非static,getInstance也非static,
- * 那么执行getInstance的前提是必须有一个Singleton的对象引用,这无疑产生了悖论,
- * 导致的后果是我们永远也无法获得这个对象实例
- *
- * 实际上instance何时创建是不一定的,可能是第一次GetInstance()时,或者第一次应用static对象时(如这里的STATUS)
- */
- public static int STATUS=1;
- private static Singleton instance=new Singleton();
- public static Singleton GetInstance() {
- return instance;
- }
-
- public static void main(String[] args) {
-// System.out.println(Singleton.STATUS);//可以看出,先created,然后打印出了STATUS
-// System.out.println(Singleton.GetInstance());//这里就只返回instance,不创建了
-
- //验证单例模式确实有效
- Thread[] t=new Thread[100];
- for(int i=0;i<100;++i) {
- t[i]=new Thread() {
- public void run() {
- try {
- System.out.println(Singleton.GetInstance());
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- };
- t[i].start();
- }
- for(int i=0;i<100;++i) {
- try {
- t[i].join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- System.out.println("end!");
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/StaticSingleton.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/StaticSingleton.java
deleted file mode 100644
index 0822c5d..0000000
--- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/StaticSingleton.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.xycode.parallelModeAndAlgorithm;
-
-public class StaticSingleton {
- private StaticSingleton() {//private的构造方法,避免外部调用多次创建
- System.out.println("StaticSingleton is created.");
- }
- /**
- * 若instance非static,getInstance也非static,
- * 那么执行getInstance的前提是必须有一个Singleton的对象引用,这无疑产生了悖论,
- * 导致的后果是我们永远也无法获得这个对象实例
- *
- * 实际上instance何时创建是不一定的,可能是第一次GetInstance()时,或者第一次应用static对象时,
- * 下面这种方式反过来利用这种缺点来实现只在第一次GetInstance()时创建
- */
- public static int STATUS=1;
- private static class SingletonHolder{//private,使外部无法访问,单例对象隐藏在这个内部类中
- private static StaticSingleton instance=new StaticSingleton();
- }
-
- public static StaticSingleton GetInstance() {
- return SingletonHolder.instance;//因为Java内存模型保证对象的创建是线程安全的,所以这种方式的单例模式也是线程安全的
- }
- public static void main(String[] args) {
- System.out.println(StaticSingleton.STATUS);//只打印了STATUS,证明此时没有创建对象
-// System.out.println(StaticSingleton.GetInstance());//这时候就创建对象了
-
- //验证单例模式确实有效
- Thread[] t=new Thread[100];
- for(int i=0;i<100;++i) {
- t[i]=new Thread() {
- public void run() {
- try {
- System.out.println(StaticSingleton.GetInstance());
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- };
- t[i].start();
- }
- for(int i=0;i<100;++i) {
- try {
- t[i].join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- System.out.println("end!");
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/BoundedExecutor.java b/MultiThread_demo/src/com/xycode/pro/BoundedExecutor.java
deleted file mode 100644
index c379197..0000000
--- a/MultiThread_demo/src/com/xycode/pro/BoundedExecutor.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.xycode.pro;
-/*
- * 使用信号量(Semaphore)来限制任务提交的速率
- */
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.Semaphore;
-
-public class BoundedExecutor {
- final ExecutorService exec;
- final Semaphore semp;
-
- public BoundedExecutor(ExecutorService exec, Semaphore semp) {
- super();
- this.exec = exec;
- this.semp = semp;
- }
-
- public void shutdown(){
- exec.shutdown();
- }
-
- public void submitTask(final Runnable task) throws InterruptedException {
- semp.acquire();
- try {
- exec.execute(new Runnable() {//对task重新包装,嵌入信号量计数
- @Override
- public void run() {
- try {
- task.run();
- }finally {
- semp.release();
- }
- }
- });
- }catch(RejectedExecutionException e) {
- semp.release();
- e.printStackTrace();
- }
- }
-
- public static void main(String[] args) {
- BoundedExecutor tasks=new BoundedExecutor(Executors.newCachedThreadPool(), new Semaphore(10));
- for(int i=0;i<100;++i) {
- try {
- tasks.submitTask(new Runnable() {
-
- @Override
- public void run() {
- System.out.println("Task-"+Thread.currentThread().getId()+" is Running.");
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- //能发现明显的间隔式地运行一组任务(一组10个)
-
- tasks.shutdown();
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/CacheTest.java b/MultiThread_demo/src/com/xycode/pro/CacheTest.java
deleted file mode 100644
index 59a36d5..0000000
--- a/MultiThread_demo/src/com/xycode/pro/CacheTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package com.xycode.pro;
-
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-public class CacheTest {
- /*
- * 使用线程安全的ConcurrentHashMap来进行缓存,效果比HashMap+synchronized好一些,
- * 然而,当单个线程计算所需时间较久时,很有可能造成重复计算
- */
- static class Memorizer_1 implements Computable{
- final Map cache=new ConcurrentHashMap<>();
-
- @Override
- public R compute(final A arg) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return (R)arg;
- }
-
- @Override
- public R get(final A arg) {
- R result=cache.get(arg);
- if(result==null) {
- result=compute(arg);
- cache.put(arg, result);
- }
- return result;
- }
-
- }
- /*
- *
- * 使用参数到Future的ConcurrentHashMap,
- * 因为future是立马获得的,所以不会因为计算时间过长而造成重复计算
- * 并且使用ConcurrentHashMap::putIfAbsent(K,V),因为该方法是原子性的,故杜绝了重复添加future的可能性
- */
- static class Memorizer_2 implements Computable{
- final Map> cache=new ConcurrentHashMap<>();
-
- @Override
- public R compute(final A arg) {
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return (R)arg;
- }
-
- @Override
- public R get(final A arg) {
- while(true) {
- Future f=cache.get(arg);
- if(f==null) {
- FutureTask ft=new FutureTask<>(new Callable() {
-
- @Override
- public R call() throws Exception {
- return compute(arg);
- }
-
- });
-
- f=cache.putIfAbsent(arg, ft);
- if(f==null) {//putIfAbsent返回null,说明先前值是null(在这里说明先前不存在这个映射,现在是第一次添加)
- f=ft;
- ft.run();//会调用call(),详见jdk源码
- }
- }
-
- try {
- return f.get();//阻塞等待(还没算好的话),否则立即返回结果
- }catch(CancellationException e) {
- e.printStackTrace();
- cache.remove(arg,f);//防止缓存污染
- }catch(RuntimeException e){
- e.printStackTrace();
- cache.remove(arg,f);//防止缓存污染
- } catch (ExecutionException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
- }
-
- static CountDownLatch gate;
- static class Task implements Runnable{
- Computable m;
- A arg;
- public Task(Computable m, A arg) {
- super();
- this.m = m;
- this.arg = arg;
- }
-
- @Override
- public void run() {
- try {
- m.get(arg);
- }finally {
- gate.countDown();//计数减一
- }
- //System.out.println(m.get(arg));
- }
-
- }
-
-
- public static void test(ExecutorService es,Computable m) {
- gate=new CountDownLatch(1000);//使用CountDownLatch来辅助计时
- Random r=new Random();
- long begin=System.currentTimeMillis();
- for(int i=0;i<1000;++i) {
- es.submit(new Task(m,r.nextInt(50)));//计算结果重复率越高,缓存的效果越好
- }
- try {
- gate.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long end=System.currentTimeMillis();
- if(m instanceof Memorizer_1)//instanceof识别是哪个类
- System.out.println("Memorizer_1's total time: "+(end-begin)/1000+" s.");
- else
- System.out.println("Memorizer_2's total time: "+(end-begin)/1000+" s.");
- es.shutdown();
- }
-
- public static void main(String[] args) {
-
- //第一种方式大概需要6s ~ 8s
-// ExecutorService es_1=new ThreadPoolExecutor(10,20,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) {
-// @Override
-// protected void terminated() {
-// System.out.println(System.currentTimeMillis()/1000%1000);
-// System.out.println("ThreadPool exit!");
-// System.out.println();
-// }
-// };
-//
-// test(es_1,new Memorizer_1());
-// System.out.println(System.currentTimeMillis()/1000%1000);
-
-
- //第二种方式大概需要3s ~ 4s,性能是第一种的两倍多
-// ExecutorService es_2=new ThreadPoolExecutor(10,20,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) {
-// @Override
-// protected void terminated() {
-// System.out.println(System.currentTimeMillis()/1000%1000);
-// System.out.println("ThreadPool exit!");
-// }
-// };
-// test(es_2,new Memorizer_2());
-// System.out.println(System.currentTimeMillis()/1000%1000);
-
-
-
-// ExecutorService es_1=Executors.newFixedThreadPool(20);
-// test(es_1,new Memorizer_1());//5s
-//
-// ExecutorService es_2=Executors.newFixedThreadPool(20);
-// test(es_2,new Memorizer_2());//2s,性能仍是2倍+的差距
-
-
- ExecutorService es_1=new TimingThreadPool
- (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque());
- ExecutorService es_2=new TimingThreadPool
- (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque());
- test(es_1,new Memorizer_1());//更精确的,从任务的平均运行时间也可看出性能的差距
- test(es_2,new Memorizer_2());
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/Computable.java b/MultiThread_demo/src/com/xycode/pro/Computable.java
deleted file mode 100644
index 41db83a..0000000
--- a/MultiThread_demo/src/com/xycode/pro/Computable.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.xycode.pro;
-
-public interface Computable {
- public R compute(A arg);
- public R get(A arg);
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/ConditionBoundedBuffer.java b/MultiThread_demo/src/com/xycode/pro/ConditionBoundedBuffer.java
deleted file mode 100644
index ca44d70..0000000
--- a/MultiThread_demo/src/com/xycode/pro/ConditionBoundedBuffer.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package com.xycode.pro;
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.TimeUnit;
-/**
- * 基于ReentrantLock与Condition的有界环形缓存(应对多线程环境)
- */
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class ConditionBoundedBuffer {
- private final Lock lock=new ReentrantLock();
- private final Condition notFull=lock.newCondition();
- private final Condition notEmpty=lock.newCondition();
- private final T[] items;
- private int head,tail,count;
-
- public ConditionBoundedBuffer(int buf_size) {
- items=(T[])new Object[buf_size];
- head=0;
- tail=0;
- count=0;
- }
-
- public void put(T item) throws InterruptedException {
- lock.lock();//lock保证某一时刻只能有一个线程修改缓存
- try {
- while(count==items.length) {//缓存已满
- notFull.await();//阻塞notFull(主要针对put方法),此时不能再添加了,会一直阻塞在这儿
- }
- items[tail++]=item;
- if(tail==items.length) {//环形缓存
- tail=0;
- }
- ++count;
- notEmpty.signal();//对外通告notEmpy(主要针对take方法),此时缓存中有数据,可以take
- }finally {
- lock.unlock();
- }
- }
-
-
- public T take() throws InterruptedException {
- lock.lock();//lock保证某一时刻只能有一个线程修改缓存
- try {
- while(count==0) {
- notEmpty.await();//阻塞notEmpty,因为缓存已经空了,不能再take
- }
- T item=items[head];
- items[head]=null;
- if(++head==items.length) {//环形缓存
- head=0;
- }
- --count;
- notFull.signal();//对外通告notFull(主要针对put方法),此时可以put
- return item;
- }finally {
- lock.unlock();
- }
- }
-
- static final Random r=new Random();
- static class Task implements Runnable{
- ConditionBoundedBuffer cb;
- int mode;
- public Task(ConditionBoundedBuffer cb,int mode) {
- super();
- this.cb = cb;
- this.mode=mode;
- }
-
- @Override
- public void run() {
- if(mode==1) {//mode==1,take...
- for(int i=0;i<1000;++i) {
- try {
- T item=cb.take();
-// System.out.println("take "+item);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }else {//else,put...
- for(int i=0;i<1000;++i) {
- Object o=r.nextInt(1000);
- //java的泛型是基于类型擦除的(先是变成Object类型)
- //所以泛型类型只能强制转换Object类型
- try {
- cb.put((T)o);
-// System.out.println("put "+o);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- System.out.println("Thread-"+Thread.currentThread().getId()+", has finished Task!");
-
- }
- }
-
- public static void main(String[] args) {
- ConditionBoundedBuffer cb=new ConditionBoundedBuffer<>(1000);
- ExecutorService es=new TimingThreadPool
- (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque());
- for(int i=0;i<1000;++i) {
- es.submit(new Task(cb, 1));
- es.submit(new Task(cb, 0));
- }
-
- es.shutdown();
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/CountDownLatch_demo.java b/MultiThread_demo/src/com/xycode/pro/CountDownLatch_demo.java
deleted file mode 100644
index 033ec59..0000000
--- a/MultiThread_demo/src/com/xycode/pro/CountDownLatch_demo.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.xycode.pro;
-
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-
-public class CountDownLatch_demo {
- Random r=new Random();
- public long Tasks(int nThread,final Runnable task) throws InterruptedException {
- final CountDownLatch startGate=new CountDownLatch(1);
- final CountDownLatch endGate=new CountDownLatch(nThread);
- for(int i=0;i implements MyMap{
- private final Map map;
- private final ReadWriteLock lock=new ReentrantReadWriteLock();
- private final Lock readLock=lock.readLock();
- private final Lock writeLock=lock.writeLock();
-
- public readWriteMap(Map map) {
- this.map = map;
- }
-
- @Override
- public V put(K key,V value) {
- writeLock.lock();
- try {
- return map.put(key, value);
- }finally {
- writeLock.unlock();
- }
- }
-
- @Override
- public V get(K key) {
- readLock.lock();
- try {
- return map.get(key);
- }finally {
- readLock.unlock();
- }
- }
-
- @Override
- public V remove(K key) {
- writeLock.lock();
- try {
- return map.remove(key);
- }finally {
- writeLock.unlock();
- }
- }
-
- @Override
- public void clear() {
- writeLock.lock();
- try {
- map.clear();
- }finally {
- writeLock.unlock();
- }
- }
-
- }
-
- static class lockMap implements MyMap{
- private final Map map;
- private final ReentrantLock lock=new ReentrantLock();
-
- public lockMap(Map map) {
- super();
- this.map = map;
- }
-
- @Override
- public V put(K key,V value) {
- lock.lock();
- try {
- return map.put(key, value);
- }finally {
- lock.unlock();
- }
- }
-
- @Override
- public V get(K key) {
- lock.lock();
- try {
- return map.get(key);
- }finally {
- lock.unlock();
- }
- }
-
- @Override
- public V remove(K key) {
- lock.lock();
- try {
- return map.remove(key);
- }finally {
- lock.unlock();
- }
- }
-
- @Override
- public void clear() {
- lock.lock();
- try {
- map.clear();
- }finally {
- lock.unlock();
- }
- }
-
- }
-
- static final Random r=new Random();
- static CountDownLatch gate;
- static class Task implements Runnable{
- MyMap map;
- List key_list;
-
- public Task(MyMap map,List key_list) {
- this.map=map;
- for(K key: key_list) {
- map.put(key, (V)String.valueOf(key));
- }
- this.key_list=key_list;
- }
-
- @Override
- public void run() {
- try {
- Collections.shuffle(key_list);
- for(K key: key_list) {
- if(r.nextDouble()<0.1) {//10%的概率write
- map.remove(key);
- }else {
- map.get(key);
- }
- }
- }finally {
- gate.countDown();//计数减一
- }
- }
-
- }
-
-
- public static void test(ExecutorService es,MyMap m,int task_num) {
- gate=new CountDownLatch(task_num);//使用CountDownLatch来辅助计时
- Random r=new Random();
- long begin=System.currentTimeMillis();
- for(int i=0;i key_list=new ArrayList<>();
- for(int j=0;j<5000;++j) {
- key_list.add(r.nextInt(5000));
- }
- es.submit(new Task(m,key_list));
- }
- try {
- gate.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long end=System.currentTimeMillis();
- if(m instanceof readWriteMap)
- System.out.println("readWriteMap's total time: "+(end-begin)+" ms.");
- else if(m instanceof lockMap)
- System.out.println("lockMap's total time: "+(end-begin)+" ms.");
- else
- System.out.println("illegal class!");
- es.shutdown();
- }
-
- public static void main(String[] args) {
- ExecutorService es_1=new TimingThreadPool
- (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque());
- ExecutorService es_2=new TimingThreadPool
- (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque());
- test(es_1,new readWriteMap(new HashMap<>()),1000);
- test(es_2,new lockMap(new HashMap<>()),1000);
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/MyLogger.java b/MultiThread_demo/src/com/xycode/pro/MyLogger.java
deleted file mode 100644
index 84abfc3..0000000
--- a/MultiThread_demo/src/com/xycode/pro/MyLogger.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.xycode.pro;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Formatter;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-public class MyLogger {
-
- public static Logger logger=Logger.getLogger("MyLogger");
- private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss(SSS");
- //public static java.lang.System.Logger log=System.getLogger("log");
-
- /*
- * 鏃ュ織绾у埆:
- * OFF
- * SEVERE
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
- ALL
-
-
- Logger榛樿鐨勭骇鍒槸INFO锛屾瘮INFO鏇翠綆鐨勬棩蹇楀皢涓嶆樉绀
- */
-
- static {
- ConsoleHandler handler=null;
- try {
- handler=new ConsoleHandler();
- handler.setFormatter(new Formatter() {
-
- @Override
- public String format(LogRecord record) {
- StringBuilder builder = new StringBuilder(1000);
- builder.append(df.format(new Date(record.getMillis()))).append("ms)");
- builder.append("[").append(record.getLevel()).append("]: ");
- builder.append(formatMessage(record));
- //builder.append("\n\t\t\tat [").append(record.getSourceClassName()).append(".");
- //builder.append(record.getSourceMethodName()).append("]");
- builder.append("\n");
- return builder.toString();
- }
- });
- } catch (SecurityException e) {
- e.printStackTrace();
- }
- logger.setUseParentHandlers(false);
- logger.addHandler(handler);
- }
-
- public static void main(String[] args) {
- ConsoleHandler handler=null;
- try {
- handler=new ConsoleHandler();
- handler.setFormatter(new Formatter() {
-
- @Override
- public String format(LogRecord record) {
- StringBuilder builder = new StringBuilder(1000);
- builder.append(df.format(new Date(record.getMillis()))).append("ms)");
- builder.append("[").append(record.getLevel()).append("]: ");
- builder.append(formatMessage(record));
- builder.append("\n\t\t\tat [").append(record.getSourceClassName()).append(".");
- builder.append(record.getSourceMethodName()).append("]");
- builder.append("\n");
- return builder.toString();
- }
- });
- } catch (SecurityException e) {
- e.printStackTrace();
- }
- logger.setUseParentHandlers(false);
- logger.addHandler(handler);
- logger.info("sssssssssss");
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/MyMap.java b/MultiThread_demo/src/com/xycode/pro/MyMap.java
deleted file mode 100644
index 8327c6c..0000000
--- a/MultiThread_demo/src/com/xycode/pro/MyMap.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.xycode.pro;
-
-public interface MyMap {
- public V put(K key,V value);
- public V remove(K key);
- public V get(K key);
- public void clear();
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/MyRandom.java b/MultiThread_demo/src/com/xycode/pro/MyRandom.java
deleted file mode 100644
index 76a3836..0000000
--- a/MultiThread_demo/src/com/xycode/pro/MyRandom.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.xycode.pro;
-
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class MyRandom {
- static class lockRandom extends Random{
- private final Lock lock=new ReentrantLock();
- private int seed;
- public lockRandom(int seed) {
- super();
- this.seed = seed;
- }
-
- @Override
- public int nextInt(int bound) {
- lock.lock();
- try {
- int s=seed;
- seed=(int) nextLong();
- int remainder=s%bound;
- return remainder>0?remainder:remainder+bound;
- }finally {
- lock.unlock();
- }
- }
- }
-
- static class atomicRandom extends Random{
- private AtomicInteger seed;
- public atomicRandom(int seed) {
- super();
- this.seed = new AtomicInteger(seed);
- }
-
- @Override
- public int nextInt(int bound) {
- int s=seed.get();
- int nextSeed=(int) nextLong();
- if(seed.compareAndSet(s, nextSeed)) {//乐观锁,CAS
- int remainder=s%bound;
- return remainder>0?remainder:remainder+bound;
- }
- return bound;
- }
- }
-
- public static void main(String[] args) {
- lockRandom lr=new lockRandom(1000);
- for(int i=0;i<100;++i) {
- System.out.println(lr.nextInt(1000));
- }
- atomicRandom ar=new atomicRandom(1000);
- for(int i=0;i<100;++i) {
- System.out.println(ar.nextInt(1000));
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/pro/TimingThreadPool.java b/MultiThread_demo/src/com/xycode/pro/TimingThreadPool.java
deleted file mode 100644
index 5ede989..0000000
--- a/MultiThread_demo/src/com/xycode/pro/TimingThreadPool.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.xycode.pro;
-/**
- * 重新包装后的线程池,主要加了计时功能
- */
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class TimingThreadPool extends ThreadPoolExecutor{
-
-
- public TimingThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
- BlockingQueue workQueue) {
- super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
- }
-
- final ThreadLocal start_time=new ThreadLocal<>();
- final AtomicLong numTasks=new AtomicLong();
- final AtomicLong total_time=new AtomicLong();
- @Override
- protected void beforeExecute(Thread t, Runnable r) {
- super.beforeExecute(t, r);
- MyLogger.logger.fine(String.format("Thread %s: start %s", t,r));
- start_time.set(System.currentTimeMillis());
- }
-
- @Override
- protected void afterExecute(Runnable r, Throwable t) {
- super.afterExecute(r, t);
- long end_time=System.currentTimeMillis();
- long taskTime=end_time-start_time.get();
- numTasks.incrementAndGet();//++i
- total_time.addAndGet(taskTime);
- MyLogger.logger.fine(String.format("Thread %s end %s, time=%d ns", t,r,taskTime));
- //默认日志等级为info,故fine等级的消息默认不会显示
- }
-
- @Override
- protected void terminated() {
- super.terminated();
- MyLogger.logger.info(String.format("Terminated:total_time:%d ns,avg_time=%d ns",
- total_time.get(),total_time.get()/numTasks.get()));
- }
-
- public static void main(String[] args) {
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/stopThread/GoodSuspend.java b/MultiThread_demo/src/com/xycode/stopThread/GoodSuspend.java
deleted file mode 100644
index 47d7a84..0000000
--- a/MultiThread_demo/src/com/xycode/stopThread/GoodSuspend.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.xycode.stopThread;
-
-import java.math.BigInteger;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingDeque;
-
-/*
- * 使用中断才是比较好的suspend方式
- */
-public class GoodSuspend {
- static class PrimeProducer extends Thread{
- private final BlockingQueue queue;
- public PrimeProducer(BlockingQueue queue) {
- super();
- this.queue = queue;
- }
-
- @Override
- public void run() {
- BigInteger p=BigInteger.ONE;
- try {
- while(true) {
- if(!Thread.currentThread().isInterrupted())
- queue.put(p=p.nextProbablePrime());
- else {
- System.out.println("Thread-"+Thread.currentThread().getId()+" interrupted,exit!");
- break;
- }
- }
- } catch (InterruptedException e) {
- System.err.println("Capacity is full!");
- e.printStackTrace();
- }
- }
-
- public void cancel() {
- interrupt();
- }
- }
- public static void main(String[] args) throws InterruptedException {
- BlockingQueue queue=new LinkedBlockingDeque<>(100);
- PrimeProducer t=new PrimeProducer(queue);
- t.start();
-
- for(int i=0;i<200;++i) {
- System.out.println(queue.take());//put的速度快于take的速度
- Thread.sleep(10);
- }
-
- t.cancel();
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/stopThread/NotBadSuspend.java b/MultiThread_demo/src/com/xycode/stopThread/NotBadSuspend.java
deleted file mode 100644
index afbca4f..0000000
--- a/MultiThread_demo/src/com/xycode/stopThread/NotBadSuspend.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.xycode.stopThread;
-/*
- * 通过标志变量来退出
- * 缺点:当线程阻塞时,可能永远都无法执行到判断标志变量的那行代码,也就无法退出了
- * (例如:LinkedBlockingQueue当队列满了时,再往里面添加数据,此时线程就会阻塞)
- */
-public class NotBadSuspend {
- public static Object o=new Object();
- public static class WriteThread extends Thread{
- volatile boolean suspendme=false;
- public volatile boolean flag=true;
- public void suspendMe() {
- suspendme=true;
- }
-
- public void resumeMe() {
- suspendme=false;
- synchronized (o) {
- o.notify();//notify后,线程不会立即释放锁
- try {
- System.out.println("WriteThread sleep 2s.(maintaining o's lock)");
- this.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
-
- }
- @Override
- public void run() {
- while(true) {
- synchronized(o){
- while(suspendme) {
- try {
- o.wait();//wait,并释放了o的锁,suspendme==true时,线程就停在这儿了
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- if(flag) {//suspendme==false时,线程就正常执行,若之前wait了,就需要notify来唤醒线程
- System.out.println("in WriteThread.");
- //flag=false;
- }
- }
-
- }
-
- }
- }
-
- public static class ReadThread extends Thread{
- public volatile boolean flag=true;
- @Override
- public void run() {
- while(true) {
- synchronized(o){
- if(flag) {
- System.out.println("in ReadThread.");
- flag=false;
- }
- }
- }
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
- WriteThread t1=new WriteThread();
- ReadThread t2=new ReadThread();
- t1.start();
- t2.start();
- Thread.sleep(1000);
- t1.suspendMe();
- System.out.println("WriteThread suspend 2s.");
- Thread.sleep(2000);
- System.out.println("WriteThread resume.");
- t1.resumeMe();//resume完全执行完毕后才会释放o的锁
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/stopThread/SemaphoreDemo.java b/MultiThread_demo/src/com/xycode/stopThread/SemaphoreDemo.java
deleted file mode 100644
index 59b8108..0000000
--- a/MultiThread_demo/src/com/xycode/stopThread/SemaphoreDemo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.xycode.stopThread;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/*
- * 信号量Semaphore,允许多个线程同时访问
- */
-public class SemaphoreDemo implements Runnable{
- final Semaphore semp=new Semaphore(5);//允许最多5个线程同时访问
- @Override
- public void run() {
- try {
- semp.acquire();
- Thread.sleep(1000);//获得一个许可
- System.out.println("Thread-"+Thread.currentThread().getId()+" done!");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- semp.release();//释放一个许可
- }
- }
- public static void main(String[] args) throws InterruptedException {
- ExecutorService exec=Executors.newFixedThreadPool(10);
-// ExecutorService exec=Executors.newCachedThreadPool();
- final SemaphoreDemo demo=new SemaphoreDemo();
- for(int i=0;i<20;++i) {
- exec.submit(new Thread(demo));
- }
- exec.awaitTermination(10, TimeUnit.SECONDS);//线程池等待指定时间(等待时间最好超过线程池中任务执行的时间)
- System.out.println("Aloha!");
- exec.shutdown();//拒绝接受新的任务,并且等待线程池中的任务执行完毕后就退出.
- //exec.shutdownNow();//线程池拒绝接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行直接退出,慎用!!!
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/stopThread/StopThreadSafe.java b/MultiThread_demo/src/com/xycode/stopThread/StopThreadSafe.java
deleted file mode 100644
index d8e77df..0000000
--- a/MultiThread_demo/src/com/xycode/stopThread/StopThreadSafe.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.xycode.stopThread;
-
-/*
- * 采用中断机制来安全的退出线程,需要注意的是当一个线程收到一个中断信号时,线程并不会立即退出,只是表明希望这个线程退出了,
- * 到底退出与否,则由该线程自行决定
- */
-public class StopThreadSafe {
- public static class User{
- private int id;
- private String name;
- public User() {
- id=0;
- name="0";
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public String toString() {
- return "id="+id+", name="+name;
- }
-
- }
- public static User u=new User();
-
- public static class WriteThread extends Thread{
- @Override
- public void run() {
- while(true) {
- if(this.isInterrupted()) {//判断当前线程是否被中断,而interrupted()不光判断是否被中断,并且会清除当前中断状态
- System.out.println("Thread-"+this.currentThread().getId()+" interruted!");
- break;
- }
-
- synchronized(u){
- int v=(int)(System.currentTimeMillis()/1000);
- u.setId(v);
-// try {
-// Thread.sleep(100);
-// }catch (Exception e) {
-// e.printStackTrace();
-// }
- for(int i=0;i<10e8;++i);
- u.setName(String.valueOf(v));
- }
- this.yield();//线程间的一种谦让机制
- }
-
- }
- }
-
-
- public static class ReadThread implements Runnable{
- @Override
- public void run() {
- while(true) {
- synchronized(u){
- if(u.getId()!=Integer.parseInt(u.getName())) {
- System.out.println(u);
- }
- }
- Thread.yield();//线程间的一种谦让机制
- }
-
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
- (new Thread(new ReadThread())).start();
- while(true) {
- Thread t=new WriteThread();
- t.start();
- Thread.sleep(200);
- t.interrupt();//main线程给线程t发中断信号,希望它停止运行
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/stopThread/StopThreadUnsafe.java b/MultiThread_demo/src/com/xycode/stopThread/StopThreadUnsafe.java
deleted file mode 100644
index 565394e..0000000
--- a/MultiThread_demo/src/com/xycode/stopThread/StopThreadUnsafe.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.xycode.stopThread;
-/* Thread.stop()是不安全的,可能会引起数据不一致的情况
- * extends Thread与implements Runnable的主要区别是:
- * 1.Thread是类,Runnable是接口,若一个线程类采用extends Thread的方式来实现,由于java不支持多继承,这个线程类将无法在继承其他类。
- * 而implements Runnable就没有这种限制
- * 2.extends Thread的方式可以使得线程类直接使用Thread的一些方法,this.xxx即可
- */
-public class StopThreadUnsafe{
- public static class User{
- private int id;
- private String name;
- public User() {
- id=0;
- name="0";
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public String toString() {
- return "id="+id+", name="+name;
- }
-
- }
- public static User u=new User();
-
- public static class WriteThread extends Thread{
- @Override
- public void run() {
- while(true) {
- synchronized(u){
- int v=(int)(System.currentTimeMillis()/1000);
- u.setId(v);
- try {
- this.sleep(100);
- }catch (Exception e) {
- e.printStackTrace();
- }
- u.setName(String.valueOf(v));
- }
- this.yield();//线程间的一种谦让机制
- }
-
- }
- }
-
-
- public static class ReadThread implements Runnable{
- @Override
- public void run() {
- while(true) {
- synchronized(u){
- if(u.getId()!=Integer.parseInt(u.getName())) {
- System.out.println(u);
- }
- }
- Thread.yield();//线程间的一种谦让机制
- }
-
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
- (new Thread(new ReadThread())).start();
- while(true) {
- Thread t=new WriteThread();
- t.start();
- Thread.sleep(200);
- t.stop();//一种废弃的方法,因为退出的机制不安全,可能出现数据不一致.
- }
-
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/stopThread/WaitAndNotify.java b/MultiThread_demo/src/com/xycode/stopThread/WaitAndNotify.java
deleted file mode 100644
index 6046c77..0000000
--- a/MultiThread_demo/src/com/xycode/stopThread/WaitAndNotify.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.xycode.stopThread;
-/*
- * wait,notify一般是和synchronized搭配使用
- * 在线程T1中,object.wait(),T1不光会wait这个object,而且T1会释放object的锁
- * 而对于object.notify(),线程必须先获得object的锁才能notify
- * wait与notify都是由某个对象来调用的,并对调用的当前线程起作用
- */
-
-public class WaitAndNotify {
- final static Object o=new Object();
- public static class T1 implements Runnable{
-
- @Override
- public void run() {
- synchronized (o) {
- System.out.println(System.currentTimeMillis()+": T1 start.");
- try {
- System.out.println(System.currentTimeMillis()+": T1 wait for o.");
- o.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(System.currentTimeMillis()+": T1 end.");
- }
- }
-
- }
-
- public static class T2 implements Runnable{
-
- @Override
- public void run() {
- synchronized (o) {
- System.out.println(System.currentTimeMillis()+": T2 start,notify T1.");
- o.notify();
- System.out.println(System.currentTimeMillis()+": T2 end.");
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
- }
-
- }
- public static void main(String[] args) {
- new Thread(new T1()).start();
- new Thread(new T2()).start();
- //T1会延迟2s才end,因为T2:o.notify()后,没有释放o的锁,并且sleep了2s,2s之后T1才得到o的锁,此时T1才能继续执行并end
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/threadlocal/Client.java b/MultiThread_demo/src/com/xycode/threadlocal/Client.java
deleted file mode 100644
index 9f74009..0000000
--- a/MultiThread_demo/src/com/xycode/threadlocal/Client.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.xycode.threadlocal;
-
-public class Client extends Thread{
-
-
- public Client(String name) {
- super(name);
- }
-
- @Override
- public void run() {
- System.out.println(getName()+" begin");
- for(int i=0;i<10;++i) {
- LogProxy.println("i = "+i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- LogProxy.close();
- System.out.println(getName()+" end");
- }
-
-
-}
diff --git a/MultiThread_demo/src/com/xycode/threadlocal/LogProxy.java b/MultiThread_demo/src/com/xycode/threadlocal/LogProxy.java
deleted file mode 100644
index 851aa8b..0000000
--- a/MultiThread_demo/src/com/xycode/threadlocal/LogProxy.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.xycode.threadlocal;
-/**
- * ThreadLocal模式,为每个线程分配TSLog,并调用
- * @author xycode
- *
- */
-public class LogProxy {
- private static final ThreadLocal tslogCollection=new ThreadLocal<>();
-
- private static TSLog getTSLog() {
- TSLog tsLog=tslogCollection.get();//会根据当前线程上下文信息来获取数据对象
- if(tsLog==null) {//之前没有分配TSLog的话就分配一个,否则就直接返回结果
- tsLog=new TSLog(Thread.currentThread().getName()+"-log.txt");
- tslogCollection.set(tsLog);
- }
- return tsLog;
- }
-
- public static void println(String s) {
- getTSLog().println(s);
- }
-
- public static void close() {
- getTSLog().close();
- }
-}
diff --git a/MultiThread_demo/src/com/xycode/threadlocal/Main.java b/MultiThread_demo/src/com/xycode/threadlocal/Main.java
deleted file mode 100644
index 44efd4d..0000000
--- a/MultiThread_demo/src/com/xycode/threadlocal/Main.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.xycode.threadlocal;
-
-public class Main {
-
- public static void main(String[] args) {
- //三个Client对应三个线程,也就对于三个TSLog
- new Client("Alice").start();
- new Client("Bob").start();
- new Client("Charis").start();
- }
-
-}
diff --git a/MultiThread_demo/src/com/xycode/threadlocal/TSLog.java b/MultiThread_demo/src/com/xycode/threadlocal/TSLog.java
deleted file mode 100644
index 9bfe477..0000000
--- a/MultiThread_demo/src/com/xycode/threadlocal/TSLog.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.xycode.threadlocal;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
-
-public class TSLog {
-
- private PrintWriter writer;
-
- public TSLog(String filename) {
- super();
- try {
- this.writer = new PrintWriter(new File(filename));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public void println(String s) {
- writer.println(s);
- }
-
- public void close() {
- writer.println("==== end of log ====");
- writer.close();
- }
-
-}
diff --git a/README.md b/README.md
deleted file mode 100644
index 1b8d7ca..0000000
--- a/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-## Java-MultiThread-Study
-
-#### 浠嬬粛: Java 澶氱嚎绋嬪涔
-
-#### 鍙傝冧功绫嶏細
-
-* 銆奐ava楂樺苟鍙戠▼搴忚璁°
-
-* 銆婂浘瑙e绾跨▼妯″紡銆
-
-* 銆奐ava骞跺彂缂栫▼瀹炴垬銆嬶紝鍦╟om.xycode.pro鍖呬腑
\ No newline at end of file
diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml
new file mode 100644
index 0000000..32b0426
--- /dev/null
+++ b/dependency-reduced-pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+ com.xycode
+ MultiThreadPro
+ 1.0-SNAPSHOT
+
+
+
+ maven-shade-plugin
+ 3.2.1
+
+
+ package
+
+ shade
+
+
+
+
+ com.xycode.synchronizedDemo.LockPromote.ObjectHeader
+
+
+
+
+
+
+
+
+
+
+ jdk-1.8
+
+ 1.8
+ 1.8
+ 1.8
+
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e1fab39
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,73 @@
+
+
+ 4.0.0
+
+ com.xycode
+ MultiThreadPro
+ 1.0-SNAPSHOT
+
+
+ jdk-1.8
+
+ true
+ 1.8
+
+
+
+ 1.8
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.1
+
+
+ package
+
+ shade
+
+
+
+
+ com.xycode.synchronizedDemo.LockPromote.ObjectHeader
+
+
+
+
+
+
+
+
+
+
+
+ org.testng
+ testng
+ 6.14.3
+
+
+
+
+ org.openjdk.jol
+ jol-core
+ 0.9
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
\ No newline at end of file
diff --git a/src/com/xycode/Tests.java b/src/com/xycode/Tests.java
new file mode 100644
index 0000000..8bf818b
--- /dev/null
+++ b/src/com/xycode/Tests.java
@@ -0,0 +1,202 @@
+package com.xycode;
+
+import com.xycode.unsafe.UnsafeUtils;
+import org.junit.Test;
+import org.testng.Assert;
+
+import javax.xml.ws.WebEndpoint;
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * ClassName: Test
+ *
+ * @Author: xycode
+ * @Date: 2019/11/9
+ * @Description: this is description of the Test class
+ **/
+public class Tests {
+ public static class test{
+// int i=j;//static internal class can only access to external class's static variables
+ //non-static internal class can access to external class's non-static/static variables
+ byte[] array=new byte[100];
+ Tests tests =new Tests();
+ }
+
+// int j=0;
+ @Test
+ public void test_1(){
+ Map mp1=new ConcurrentHashMap(){
+ {
+ put("1","one");
+ put("2","two");
+ put("3","three");
+ }
+ };
+ Map mp2=new ConcurrentHashMap(){
+ {
+ put("one","1");
+ put("two","2");
+ put("three","3");
+ }
+ };
+ Assert.assertEquals(mp1.get("xxx"),null);
+ Assert.assertEquals(mp2.get("xxx"),null);
+ System.out.println(mp1);
+ System.out.println(mp2);
+ Assert.assertEquals(mp1.containsKey("1"),true);
+ Assert.assertEquals(mp2.containsKey("one"),true);
+ for(String key:mp1.keySet()){
+ Assert.assertNotEquals(mp2.remove(mp1.remove(key)),null);
+ }
+ Assert.assertEquals(mp1.isEmpty(),true);
+ Assert.assertEquals(mp2.isEmpty(),true);
+
+ }
+
+ public static String transfer(String s){
+ System.out.println("--> transfer...");
+ return s.toUpperCase();
+ }
+
+ public static String func(){
+ try {
+ System.out.println("try...");
+ String result="returnStr";
+// System.out.println(result);
+ return transfer(result);
+ }finally {
+ System.out.println("finally...");
+ }
+ }
+
+ public static void main(String[] args) throws InterruptedException {
+
+// Semaphore semaphore=new Semaphore(1);
+// try {
+// semaphore.acquire();
+// semaphore.acquire();
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }finally {
+// semaphore.release();
+// semaphore.release();
+// }
+//
+// ReentrantLock lock=new ReentrantLock();
+// lock.lock();
+// Condition condition=lock.newCondition();
+// try {
+// condition.await();
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }
+// lock.unlock();
+
+// //notice: 骞界伒寮曠敤绀轰緥
+// Object o=new Object();
+// ReferenceQueue