From e70fd4ae2b3e0f8013e41493f0a6d0b80a2ca2f0 Mon Sep 17 00:00:00 2001 From: "dan.wang1030" <18730601431@163.com> Date: Fri, 29 Jan 2021 18:25:29 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B5=8B=E8=AF=95join,=20waitAndNotify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03concurrency/0301/pom.xml | 5 +- .../src/main/java/java0/conc0301/op/Join.java | 1 + .../main/java/java0/conc0301/op/Join2.java | 68 +++++++++++++++++++ .../java/java0/conc0301/op/WaitAndNotify.java | 1 + .../java0/conc0301/op/WaitAndNotifyTest.java | 68 +++++++++++++++++++ .../java0/conc0302/atomic/AtomicMain.java | 4 +- .../java/java0/conc0302/atomic/SyncCount.java | 14 +--- .../conc0302/threadpool/ExceptionDemo.java | 20 +++--- .../conc0303/tool/CountDownLatchDemo.java | 2 +- .../conc0303/tool/CyclicBarrierDemo.java | 4 +- .../java0/conc0303/tool/SemaphoreDemo.java | 2 +- 11 files changed, 159 insertions(+), 30 deletions(-) create mode 100644 03concurrency/0301/src/main/java/java0/conc0301/op/Join2.java create mode 100644 03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotifyTest.java diff --git a/03concurrency/0301/pom.xml b/03concurrency/0301/pom.xml index 55691a2d..876e00b2 100644 --- a/03concurrency/0301/pom.xml +++ b/03concurrency/0301/pom.xml @@ -12,9 +12,10 @@ org.apache.maven.plugins maven-compiler-plugin + 3.8.0 - 8 - 8 + 1.8 + 1.8 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 1cbf6a5a..5c59c3e3 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java @@ -9,6 +9,7 @@ public static void main(String[] args) { //oo = thread1; thread1.setOo(oo); thread1.start(); + synchronized (oo) { // 这里用oo或thread1/this for (int i = 0; i < 100; i++) { diff --git a/03concurrency/0301/src/main/java/java0/conc0301/op/Join2.java b/03concurrency/0301/src/main/java/java0/conc0301/op/Join2.java new file mode 100644 index 00000000..3f15a761 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/Join2.java @@ -0,0 +1,68 @@ +package java0.conc0301.op; + +public class Join2 { + + public static void main(String[] args) { + Object oo = new Object(); + + MyThread2 thread1 = new MyThread2("thread1 -- "); + //oo = thread1; + thread1.setOo(oo); + thread1.start(); + + synchronized (oo) { // 这里用oo或thread1/this + for (int i = 0; i < 100; i++) { + try { + if (i % 2 == 1) { + System.out.println(Thread.currentThread().getName() + " -- " + i); + //thread1.join(); + } else { + oo.wait(1); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + + oo.notifyAll(); + } + } + + + + + } + +} + +class MyThread2 extends Thread { + + private String name; + private Object oo; + + public void setOo(Object oo) { + this.oo = oo; + } + + public MyThread2(String name) { + this.name = name; + } + + @Override + public void run() { + try{ + synchronized (oo) { // 这里用oo或this,效果不同 + for (int i = 0; i < 100; i++) { + if (i%2 == 0){ + System.out.println(name + i); + }else { + oo.wait(1); + } + } + } + }catch (InterruptedException ex){ + ex.printStackTrace(); + } + + } + +} \ No newline at end of file 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 e3956c10..96229ee8 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java @@ -11,6 +11,7 @@ public static void main(String[] args) { e.printStackTrace(); } }, "t1"); + Object obj = new Object(); Thread t2 = new Thread(() -> { try { methodClass.customer(); diff --git a/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotifyTest.java b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotifyTest.java new file mode 100644 index 00000000..bb489d30 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotifyTest.java @@ -0,0 +1,68 @@ +package java0.conc0301.op; + +public class WaitAndNotifyTest { + + public static void main(String[] args){ + WaitAndNotifyProduct andNotifyProduct = new WaitAndNotifyProduct(); + + Thread thread1 = new Thread(new Runnable() { + @Override + public void run() { + try { + andNotifyProduct.add(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }, "t1"); + Thread t2 = new Thread(new Runnable() { + @Override + public void run() { + try { + andNotifyProduct.sub(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }, "t2"); + thread1.start(); + t2.start(); + + + + } + + + static class WaitAndNotifyProduct{ + + int count = 1; + + public synchronized void add() throws InterruptedException { + while (true){ + if (count < 10){ + count++; + System.out.println(Thread.currentThread().getName() + "::::" + count); + }else { + wait(); + System.out.println(Thread.currentThread().getName() + "等待仓库空间。。。。"); + } + notifyAll(); + } + + } + + public synchronized void sub() throws InterruptedException { + while (true){ + if (count > 0){ + count--; + System.out.println(Thread.currentThread().getName() + "::::" + count); + }else { + wait(); + System.out.println(Thread.currentThread().getName() + "等待工厂生产商品。。。"); + } + notifyAll(); + } + + } + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java index 297eb343..de251e57 100644 --- a/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/AtomicMain.java @@ -4,7 +4,7 @@ public class AtomicMain { public static void main(String[] args) { - final SyncCount count = new SyncCount(); + final AtomicCount count = new AtomicCount(); for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override @@ -17,7 +17,7 @@ public void run() { } try { - Thread.sleep(5000L); + Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java b/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java index b95c7cff..5a32183e 100644 --- a/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/atomic/SyncCount.java @@ -1,22 +1,12 @@ package java0.conc0302.atomic; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - public class SyncCount { private int num = 0; - private Lock lock = new ReentrantLock(true); - - public int add() { - try { - lock.lock(); - return num++; - } finally { - lock.unlock(); - } + public synchronized int add() { + return num++; } public int getNum() { diff --git a/03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExceptionDemo.java b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExceptionDemo.java index 22240c51..c9174072 100644 --- a/03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExceptionDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0302/threadpool/ExceptionDemo.java @@ -21,16 +21,16 @@ public static void main(String[] args) { System.out.println("catch submit"); ex.printStackTrace(); } -// -// try { -// executorService.execute(() -> { -// throw new RuntimeException("executorService.execute()"); -// }); -// } catch (Exception ex) { -// System.out.println("catch execute"); -// ex.printStackTrace(); -// } -// + + try { + executorService.execute(() -> { + throw new RuntimeException("executorService.execute()"); + }); + } catch (Exception ex) { + System.out.println("catch execute"); + ex.printStackTrace(); + } + executorService.shutdown(); System.out.println("Main Thread End!"); } diff --git a/03concurrency/0301/src/main/java/java0/conc0303/tool/CountDownLatchDemo.java b/03concurrency/0301/src/main/java/java0/conc0303/tool/CountDownLatchDemo.java index b93731be..66cd7406 100644 --- a/03concurrency/0301/src/main/java/java0/conc0303/tool/CountDownLatchDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0303/tool/CountDownLatchDemo.java @@ -5,7 +5,7 @@ public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(5); - for(int i=0;i<5;i++){ + for(int i=0;i<10;i++){ new Thread(new readNum(i,countDownLatch)).start(); } countDownLatch.await(); // 注意跟CyclicBarrier不同,这里在主线程await diff --git a/03concurrency/0301/src/main/java/java0/conc0303/tool/CyclicBarrierDemo.java b/03concurrency/0301/src/main/java/java0/conc0303/tool/CyclicBarrierDemo.java index 628d980d..fd7b8aa6 100644 --- a/03concurrency/0301/src/main/java/java0/conc0303/tool/CyclicBarrierDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0303/tool/CyclicBarrierDemo.java @@ -39,9 +39,9 @@ public void run() { synchronized (this){ System.out.println("id:"+id+","+Thread.currentThread().getName()); try { - cyc.await(); + //cyc.await(); System.out.println("线程组任务" + id + "结束,其他任务继续"); - //cyc.await(); // 注意跟CountDownLatch不同,这里在子线程await + cyc.await(); // 注意跟CountDownLatch不同,这里在子线程await } catch (Exception e) { e.printStackTrace(); } diff --git a/03concurrency/0301/src/main/java/java0/conc0303/tool/SemaphoreDemo.java b/03concurrency/0301/src/main/java/java0/conc0303/tool/SemaphoreDemo.java index d9642c04..542ae10b 100644 --- a/03concurrency/0301/src/main/java/java0/conc0303/tool/SemaphoreDemo.java +++ b/03concurrency/0301/src/main/java/java0/conc0303/tool/SemaphoreDemo.java @@ -6,7 +6,7 @@ public class SemaphoreDemo { public static void main(String[] args) { int N = 8; //工人数 - Semaphore semaphore = new Semaphore(2); //机器数目 + Semaphore semaphore = new Semaphore(1); //机器数目 for (int i = 0; i < N; i++) new Worker(i, semaphore).start(); } From 86612ef48705b99d12534cbba2b8932f40058299 Mon Sep 17 00:00:00 2001 From: wangdan1 Date: Fri, 29 Jan 2021 22:10:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=88=B0thread.interrupt?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E9=97=AE=E9=A2=98=EF=BC=8C=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E4=BB=94=E7=BB=86=E7=9C=8B=E4=B8=80=E4=B8=8BThread.interrupt?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/java0/conc0301/DaemonThread.java | 17 +++++++++-------- .../main/java/java0/conc0301/RunnerMain.java | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java b/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java index 5fec537e..0dac8be3 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java @@ -1,24 +1,25 @@ package java0.conc0301; public class DaemonThread { - + public static void main(String[] args) throws InterruptedException { Runnable task = () -> { - try { - Thread.sleep(1000); + try { + System.out.println("当前线程:" + Thread.currentThread().getName()); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } - Thread t = Thread.currentThread(); - System.out.println("当前线程:" + t.getName()); + Thread t = Thread.currentThread(); + System.out.println("当前线程:" + t.getName()); }; Thread thread = new Thread(task); thread.setName("test-thread-1"); thread.setDaemon(true); thread.start(); - //Thread.sleep(2000); + Thread.sleep(2000); } - - + + } diff --git a/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java b/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java index 626f2d38..15a6f709 100644 --- a/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java +++ b/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java @@ -16,6 +16,7 @@ public static void main(String[] args) throws IOException { thread1.start(); thread2.start(); + //TODO thread2.interrupt(); // i = true System.out.println(Thread.activeCount());