From 4580fc58a4c936abd9367711ae839858453c8ca2 Mon Sep 17 00:00:00 2001 From: kimmking Date: Wed, 4 Nov 2020 23:21:20 +0800 Subject: [PATCH 1/2] update --- .../gateway/router/HttpEndpointRouter.java | 8 +++++++ .../java/java0/conc0301/DaemonThread.java | 2 +- .../src/main/java/java0/conc0301/Runner2.java | 4 +++- .../main/java/java0/conc0301/RunnerMain.java | 14 ++++++++----- .../src/main/java/java0/conc0301/ThreadB.java | 2 +- .../main/java/java0/conc0301/ThreadMain.java | 2 +- .../src/main/java/java0/conc0301/op/Join.java | 4 ++-- .../java/java0/conc0301/op/WaitAndNotify.java | 18 ++++++++-------- .../java/java0/conc0301/sync/Counter.java | 21 ++++++++++++------- .../main/java/java0/conc0301/sync/Cref.java | 8 +++++++ .../threadpool/ExecutorServiceDemo.java | 2 +- .../threadpool/NewCachedThreadPoolDemo.java | 2 +- .../NewFixedThreadExecutorDemo.java | 2 +- .../NewScheduledThreadExecutorDemo.java | 2 +- .../NewSingleThreadExecutorDemo.java | 2 +- 15 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 03concurrency/0301/src/main/java/java0/conc0301/sync/Cref.java rename 03concurrency/0301/src/main/java/java0/{conc0301 => conc0302}/threadpool/ExecutorServiceDemo.java (95%) rename 03concurrency/0301/src/main/java/java0/{conc0301 => conc0302}/threadpool/NewCachedThreadPoolDemo.java (96%) rename 03concurrency/0301/src/main/java/java0/{conc0301 => conc0302}/threadpool/NewFixedThreadExecutorDemo.java (95%) rename 03concurrency/0301/src/main/java/java0/{conc0301 => conc0302}/threadpool/NewScheduledThreadExecutorDemo.java (96%) rename 03concurrency/0301/src/main/java/java0/{conc0301 => conc0302}/threadpool/NewSingleThreadExecutorDemo.java (95%) diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java index f921330a..8e307ab7 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java @@ -6,4 +6,12 @@ public interface HttpEndpointRouter { String route(List endpoints); + // Load Balance + // Random + // RoundRibbon + // Weight + // - server01,20 + // - server02,30 + // - server03,50 + } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java b/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java index 8d985a55..5a00ab24 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java @@ -17,7 +17,7 @@ public void run() { }; Thread thread = new Thread(task); thread.setName("test-thread-1"); - thread.setDaemon(true); + thread.setDaemon(false); thread.start(); } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java b/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java index c9ff3b96..d80e8c14 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java @@ -11,11 +11,13 @@ public void run() { boolean result = Thread.currentThread().isInterrupted(); boolean result1 = Thread.interrupted(); // 重置状态 - + boolean result3 = Thread.currentThread().isInterrupted(); System.out.println("Runner2.run result ===>" + result); System.out.println("Runner2.run result1 ===>" + result1); System.out.println("Runner2.run result3 ===>" + result3); + + } } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java b/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java index 4526412e..626f2d38 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java @@ -1,9 +1,11 @@ package java0.conc0301; +import java.io.IOException; + public class RunnerMain { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { Runner1 runner1 = new Runner1(); Thread thread1 = new Thread(runner1); @@ -14,12 +16,14 @@ public static void main(String[] args) { thread1.start(); thread2.start(); - thread2.interrupt(); + thread2.interrupt(); // i = true System.out.println(Thread.activeCount()); -// Thread.currentThread().getThreadGroup().list(); -// System.out.println(Thread.currentThread().getThreadGroup().getParent().activeGroupCount()); -// Thread.currentThread().getThreadGroup().getParent().list(); + Thread.currentThread().getThreadGroup().list(); + System.out.println(Thread.currentThread().getThreadGroup().getParent().activeGroupCount()); + Thread.currentThread().getThreadGroup().getParent().list(); + + } } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java index 0b0ad326..fe7dda58 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java @@ -15,7 +15,7 @@ public void run() { String currentThreadName = currentThread.getName(); System.out.println("这是线程的名称:" + currentThreadName); - System.out.println("返回当前线程" + currentThreadName + "的线程组中活动线程的数量:" + Thread.activeCount()); + System.out.println("返回当前线程" + currentThreadName + "的线程组中活动线程的数量:" + Thread.currentThread().getThreadGroup().activeCount()); System.out.println("返回该线程" + currentThreadName + "的标识符:" + currentThread.getId()); System.out.println("返回该线程" + currentThreadName + "的优先级:" + currentThread.getPriority()); System.out.println("返回该线程" + currentThreadName + "的状态:" + currentThread.getState()); diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java index 3a12ddb7..5478e112 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java @@ -15,7 +15,7 @@ public static void main(String[] args) { new Thread(threadB).start(); System.out.println("这是主线程:"); - ThreadC threadC = new ThreadC(); + ThreadC threadC = new ThreadC(); FutureTask futureTask = new FutureTask<>(threadC); new Thread(futureTask).start(); System.out.println("这是主线程:begin!"); diff --git a/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java b/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java index 13fadb19..5e60163a 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java @@ -9,7 +9,7 @@ public static void main(String[] args) { thread1.setOo(oo); thread1.start(); - synchronized (oo) { + synchronized (thread1) { for (int i = 0; i < 100; i++) { if (i == 20) { try { @@ -40,7 +40,7 @@ public MyThread(String name) { @Override public void run() { - synchronized (oo) { + synchronized (this) { for (int i = 0; i < 100; i++) { System.out.println(name + i); } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java index bd3e1e4e..e3956c10 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java @@ -19,17 +19,17 @@ public static void main(String[] args) { e.printStackTrace(); } }, "t2"); - Thread t3 = new Thread(() -> { - try { - methodClass.customer(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - }, "t3"); +// Thread t3 = new Thread(() -> { +// try { +// methodClass.customer(); +// } catch (InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// }, "t3"); t1.start(); t2.start(); - t3.start(); + //t3.start(); } } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java b/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java index a066caf8..e60845a6 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java @@ -1,16 +1,21 @@ package java0.conc0301.sync; public class Counter { - private int sum = 0; - public void incr() { - sum++; + + public final static int A=10; + + public static int B=10; + + private volatile int sum = 0; + public synchronized void incr() { + sum=sum+1; } public int getSum() { return sum; } public static void main(String[] args) throws InterruptedException { - int loop = 10000; + int loop = 100000; // test single thread Counter counter = new Counter(); @@ -33,10 +38,10 @@ public static void main(String[] args) throws InterruptedException { }); t1.start(); t2.start(); - //Thread.sleep(300); - while (Thread.activeCount()>2){//当前线程的线程组中的数量>2 - Thread.yield(); - } + Thread.sleep(1000); +// while (Thread.activeCount()>2){//当前线程的线程组中的数量>2 +// Thread.yield(); +// } System.out.println("multiple threads: " + counter2.getSum()); diff --git a/03concurrency/0301/src/main/java/java0/conc0301/sync/Cref.java b/03concurrency/0301/src/main/java/java0/conc0301/sync/Cref.java new file mode 100644 index 00000000..f80742b0 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/sync/Cref.java @@ -0,0 +1,8 @@ +package java0.conc0301.sync; + +public class Cref { + public static void main(String[] args) { + int x = 10; + int y = Counter.B; + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/ExecutorServiceDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExecutorServiceDemo.java similarity index 95% rename from 03concurrency/0301/src/main/java/java0/conc0301/threadpool/ExecutorServiceDemo.java rename to 03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExecutorServiceDemo.java index cc777c9a..664b6942 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/ExecutorServiceDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExecutorServiceDemo.java @@ -1,5 +1,5 @@ -package java0.conc0301.threadpool; +package java0.conc0302.threadpool; import java.util.concurrent.Callable; import java.util.concurrent.Executors; diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewCachedThreadPoolDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewCachedThreadPoolDemo.java similarity index 96% rename from 03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewCachedThreadPoolDemo.java rename to 03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewCachedThreadPoolDemo.java index 69cb8a6e..2137af53 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewCachedThreadPoolDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewCachedThreadPoolDemo.java @@ -1,5 +1,5 @@ -package java0.conc0301.threadpool; +package java0.conc0302.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewFixedThreadExecutorDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewFixedThreadExecutorDemo.java similarity index 95% rename from 03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewFixedThreadExecutorDemo.java rename to 03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewFixedThreadExecutorDemo.java index 19bc39bc..9f7dba25 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewFixedThreadExecutorDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewFixedThreadExecutorDemo.java @@ -1,5 +1,5 @@ -package java0.conc0301.threadpool; +package java0.conc0302.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewScheduledThreadExecutorDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewScheduledThreadExecutorDemo.java similarity index 96% rename from 03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewScheduledThreadExecutorDemo.java rename to 03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewScheduledThreadExecutorDemo.java index 9186d21b..3a618f0c 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewScheduledThreadExecutorDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewScheduledThreadExecutorDemo.java @@ -1,5 +1,5 @@ -package java0.conc0301.threadpool; +package java0.conc0302.threadpool; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewSingleThreadExecutorDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewSingleThreadExecutorDemo.java similarity index 95% rename from 03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewSingleThreadExecutorDemo.java rename to 03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewSingleThreadExecutorDemo.java index e328ca83..dee7b07c 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewSingleThreadExecutorDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/NewSingleThreadExecutorDemo.java @@ -1,5 +1,5 @@ -package java0.conc0301.threadpool; +package java0.conc0302.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; From a19fa69e37f49f252afd0986a4c649d5bebf39ca Mon Sep 17 00:00:00 2001 From: kimmking Date: Thu, 5 Nov 2020 18:31:17 +0800 Subject: [PATCH 2/2] udpate 0302 --- .../java0/conc0302/atomic/AtomicCount.java | 17 +++++++ .../java0/conc0302/atomic/AtomicMain.java | 28 ++++++++++++ .../java/java0/conc0302/atomic/Count.java | 15 +++++++ .../java/java0/conc0302/atomic/LongDemo.java | 35 +++++++++++++++ .../java/java0/conc0302/atomic/SyncCount.java | 15 +++++++ .../java0/conc0302/lock/ConditionDemo.java | 45 +++++++++++++++++++ .../java0/conc0302/lock/LockSupportDemo.java | 37 +++++++++++++++ 7 files changed, 192 insertions(+) create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicCount.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/atomic/Count.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/atomic/LongDemo.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/lock/ConditionDemo.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0302/lock/LockSupportDemo.java diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicCount.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicCount.java new file mode 100644 index 00000000..21e28987 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicCount.java @@ -0,0 +1,17 @@ + +package java0.conc0302.atomic; + +import java.util.concurrent.atomic.AtomicInteger; + +public class AtomicCount { + + private AtomicInteger num = new AtomicInteger(); + + public synchronized int add() { + return num.getAndIncrement(); + } + + public int getNum() { + return num.get(); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java new file mode 100644 index 00000000..de251e57 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java @@ -0,0 +1,28 @@ + +package java0.conc0302.atomic; + +public class AtomicMain { + + public static void main(String[] args) { + final AtomicCount count = new AtomicCount(); + for (int i = 0; i < 100; i++) { + new Thread(new Runnable() { + @Override + public void run() { + for (int j = 0; j < 10000; j++) { + count.add(); + } + } + }).start(); + } + + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println("num=" + count.getNum()); + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/Count.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/Count.java new file mode 100644 index 00000000..02fd13d5 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/Count.java @@ -0,0 +1,15 @@ + +package java0.conc0302.atomic; + +public class Count { + + private int num = 0; + + public int add() { + return num++; + } + + public int getNum() { + return num; + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/LongDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/LongDemo.java new file mode 100644 index 00000000..6a7356c6 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/LongDemo.java @@ -0,0 +1,35 @@ +package java0.conc0302.atomic; + +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; + +public class LongDemo { + + public static void main(String[] args) { + + final AtomicLong atomicLong = new AtomicLong(); + final LongAdder longAdder = new LongAdder(); + + for (int i = 0; i < 100; i++) { + new Thread(new Runnable() { + @Override + public void run() { + for (int j = 0; j < 10000; j++) { + atomicLong.getAndIncrement(); + longAdder.increment(); + } + } + }).start(); + } + + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println("atomicLong=" + atomicLong.get()); + System.out.println("longAdder =" + longAdder.sum()); + + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java new file mode 100644 index 00000000..5a32183e --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java @@ -0,0 +1,15 @@ + +package java0.conc0302.atomic; + +public class SyncCount { + + private int num = 0; + + public synchronized int add() { + return num++; + } + + public int getNum() { + return num; + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0302/lock/ConditionDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/lock/ConditionDemo.java new file mode 100644 index 00000000..33ad0bab --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/lock/ConditionDemo.java @@ -0,0 +1,45 @@ +package java0.conc0302.lock; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +class ConditionDemo { + final Lock lock = new ReentrantLock(); + final Condition notFull = lock.newCondition(); + final Condition notEmpty = lock.newCondition(); + + final Object[] items = new Object[20]; + int putptr, takeptr, count; + + public void put(Object x) throws InterruptedException { + lock.lock(); + try { + // 当count等于数组的大小时,当前线程等待,直到notFull通知,再进行生产 + while (count == items.length) + notFull.await(); + items[putptr] = x; + if (++putptr == items.length) putptr = 0; + ++count; + notEmpty.signal(); + } finally { + lock.unlock(); + } + } + + public Object take() throws InterruptedException { + lock.lock(); + try { + // 当count为0,进入等待,直到notEmpty通知,进行消费。 + while (count == 0) + notEmpty.await(); + Object x = items[takeptr]; + if (++takeptr == items.length) takeptr = 0; + --count; + notFull.signal(); + return x; + } finally { + lock.unlock(); + } + } +} \ No newline at end of file diff --git a/03concurrency/0301/src/main/java/java0/conc0302/lock/LockSupportDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/lock/LockSupportDemo.java new file mode 100644 index 00000000..18f598f1 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0302/lock/LockSupportDemo.java @@ -0,0 +1,37 @@ +package java0.conc0302.lock; + +import java.util.concurrent.locks.LockSupport; + +public class LockSupportDemo { + + public static Object u = new Object(); + static ChangeObjectThread t1 = new ChangeObjectThread("t1"); + static ChangeObjectThread t2 = new ChangeObjectThread("t2"); + + public static class ChangeObjectThread extends Thread { + public ChangeObjectThread(String name) { + super(name); + } + @Override public void run() { + synchronized (u) { + System.out.println("in " + getName()); + LockSupport.park(); + if (Thread.currentThread().isInterrupted()) { + System.out.println("被中断了"); + } + System.out.println("继续执行"); + } + } + } + + public static void main(String[] args) throws InterruptedException { + t1.start(); + Thread.sleep(1000L); + t2.start(); + Thread.sleep(3000L); + t1.interrupt(); + LockSupport.unpark(t2); + t1.join(); + t2.join(); + } +} \ No newline at end of file