From 4cd3a7847841a1102047ed14549827b58cc84125 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Fri, 23 Jun 2017 09:40:17 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BAknowledge-point=E7=9B=AE?=
=?UTF-8?q?=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
liuxin/knowledge-point/pom.xml | 32 ++++++++++++++++
.../src/main/java/cas/CASSequence.java | 18 +++++++++
.../src/main/java/cas/NoBlockingStack.java | 34 +++++++++++++++++
.../src/main/java/cas/Sequence.java | 11 ++++++
.../src/main/java/threadlocal/Context.java | 20 ++++++++++
.../java/threadlocal/TransactionManager.java | 22 +++++++++++
.../main/java/threadpool/BlockingQueue.java | 35 ++++++++++++++++++
.../src/main/java/threadpool/Task.java | 5 +++
.../src/main/java/threadpool/ThreadPool.java | 37 +++++++++++++++++++
.../main/java/threadpool/WorkerThread.java | 33 +++++++++++++++++
10 files changed, 247 insertions(+)
create mode 100644 liuxin/knowledge-point/pom.xml
create mode 100644 liuxin/knowledge-point/src/main/java/cas/CASSequence.java
create mode 100644 liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
create mode 100644 liuxin/knowledge-point/src/main/java/cas/Sequence.java
create mode 100644 liuxin/knowledge-point/src/main/java/threadlocal/Context.java
create mode 100644 liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/Task.java
create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/WorkerThread.java
diff --git a/liuxin/knowledge-point/pom.xml b/liuxin/knowledge-point/pom.xml
new file mode 100644
index 0000000000..3dc438c7d9
--- /dev/null
+++ b/liuxin/knowledge-point/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ knowledge-point
+ 0.0.1-SNAPSHOT
+ jar
+
+ knowledge-point
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/liuxin/knowledge-point/src/main/java/cas/CASSequence.java b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java
new file mode 100644
index 0000000000..dcff77d9bf
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java
@@ -0,0 +1,18 @@
+package cas;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CASSequence{
+
+ private AtomicInteger count = new AtomicInteger(0);
+
+ public int next(){
+ while(true){
+ int current = count.get();
+ int next = current +1;
+ if(count.compareAndSet(current, next)){
+ return next;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
new file mode 100644
index 0000000000..d7be44c69a
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
@@ -0,0 +1,34 @@
+package cas;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public class NoBlockingStack {
+ static class Node {
+ final E item;
+ Node next;
+ public Node(E item) { this.item = item; }
+ }
+
+ AtomicReference> head = new AtomicReference>();
+
+ public void push(E item) {
+ Node newHead = new Node(item);
+ Node oldHead;
+ do {
+ oldHead = head.get();
+ newHead.next = oldHead;
+ } while (!head.compareAndSet(oldHead, newHead));
+ }
+ public E pop() {
+ Node oldHead;
+ Node newHead;
+ do {
+ oldHead = head.get();
+ if (oldHead == null)
+ return null;
+ newHead = oldHead.next;
+ } while (!head.compareAndSet(oldHead,newHead));
+ return oldHead.item;
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/cas/Sequence.java b/liuxin/knowledge-point/src/main/java/cas/Sequence.java
new file mode 100644
index 0000000000..688224e251
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/Sequence.java
@@ -0,0 +1,11 @@
+package cas;
+
+public class Sequence{
+
+ private int value;
+
+ public int next(){
+ return value ++;
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/Context.java b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java
new file mode 100644
index 0000000000..d84584397b
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java
@@ -0,0 +1,20 @@
+package threadlocal;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Context {
+
+ private static final ThreadLocal txThreadLocal
+ = new ThreadLocal();
+
+ public static void setTransactionID(String txID) {
+ txThreadLocal.set(txID);
+
+ }
+
+ public static String getTransactionId() {
+ return txThreadLocal.get();
+ }
+
+}
+
diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
new file mode 100644
index 0000000000..8a5283fcab
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
@@ -0,0 +1,22 @@
+package threadlocal;
+
+public class TransactionManager {
+ private static final ThreadLocal context = new ThreadLocal();
+
+ public static void startTransaction() {
+ // logic to start a transaction
+ // ...
+ String txID = null;
+ context.set(txID);
+ }
+
+ public static String getTransactionId() {
+ return context.get();
+ }
+
+ public static void endTransaction() {
+ // logic to end a transaction
+ // …
+ context.remove();
+ }
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
new file mode 100644
index 0000000000..faca2d2c70
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
@@ -0,0 +1,35 @@
+package threadpool;
+import java.util.LinkedList;
+import java.util.List;
+
+public class BlockingQueue {
+
+ private List queue = new LinkedList();
+ private int limit = 10;
+
+ public BlockingQueue(int limit) {
+ this.limit = limit;
+ }
+
+ public synchronized void enqueue(Object item) throws InterruptedException {
+ while (this.queue.size() == this.limit) {
+ wait();
+ }
+ if (this.queue.size() == 0) {
+ notifyAll();
+ }
+ this.queue.add(item);
+ }
+
+ public synchronized Object dequeue() throws InterruptedException {
+ while (this.queue.size() == 0) {
+ wait();
+ }
+ if (this.queue.size() == this.limit) {
+ notifyAll();
+ }
+
+ return this.queue.remove(0);
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/Task.java b/liuxin/knowledge-point/src/main/java/threadpool/Task.java
new file mode 100644
index 0000000000..07413d9798
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/Task.java
@@ -0,0 +1,5 @@
+package threadpool;
+
+public interface Task {
+ public void execute();
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
new file mode 100644
index 0000000000..f508f76eb5
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
@@ -0,0 +1,37 @@
+package threadpool;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ThreadPool {
+
+ private BlockingQueue taskQueue = null;
+ private List threads = new ArrayList();
+ private boolean isStopped = false;
+
+ public ThreadPool(int numOfThreads, int maxNumOfTasks){
+ taskQueue = new BlockingQueue(maxNumOfTasks);
+
+ for(int i=0; i