From fe9af858c14d98debc54680f8946f2addf5f0cc3 Mon Sep 17 00:00:00 2001 From: javahongxi Date: Tue, 13 Aug 2019 16:07:38 +0800 Subject: [PATCH] concurrent test --- .../java/util/concurrent/BlockingStack.java | 40 +++++++++++++ .../util/concurrent/BlockingStackTest.java | 59 +++++++++++++++++++ .../java/util/concurrent/sync/Consumer.java | 30 ---------- .../java/util/concurrent/sync/Main.java | 16 ----- .../java/util/concurrent/sync/Producer.java | 31 ---------- .../java/util/concurrent/sync/Work.java | 22 ------- .../java/util/concurrent/sync/WorkStack.java | 30 ---------- 7 files changed, 99 insertions(+), 129 deletions(-) create mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStack.java create mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStackTest.java delete mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Consumer.java delete mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Main.java delete mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Producer.java delete mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Work.java delete mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/WorkStack.java diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStack.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStack.java new file mode 100644 index 00000000..69467d32 --- /dev/null +++ b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStack.java @@ -0,0 +1,40 @@ +package org.hongxi.java.util.concurrent; + +/** + * @author shenhongxi 2019/8/13 + */ +public class BlockingStack { + private static final int DEFAULT_CAPACITY = 10; + + Object[] items; + int size; + + BlockingStack() { + items = new Object[DEFAULT_CAPACITY]; + } + + BlockingStack(int capacity) { + if (capacity <= 0) throw new IllegalArgumentException(); + items = new Object[capacity]; + } + + public synchronized void push(E item) { + while (size == items.length) { + try { + this.wait(); + } catch (InterruptedException e) {} + } + this.notifyAll(); + items[size++] = item; + } + + public synchronized E pop() { + while (size == 0) { + try { + this.wait(); + } catch (InterruptedException e) {} + } + this.notifyAll(); + return (E) items[--size]; + } +} diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStackTest.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStackTest.java new file mode 100644 index 00000000..40d1679b --- /dev/null +++ b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/BlockingStackTest.java @@ -0,0 +1,59 @@ +package org.hongxi.java.util.concurrent; + +/** + * @author shenhongxi 2019/8/13 + */ +public class BlockingStackTest { + + public static void main(String[] args) { + BlockingStack stack = new BlockingStack<>(10); + + new Thread(new Producer(stack, "p1")).start(); + new Thread(new Consumer(stack, "c1")).start(); + new Thread(new Producer(stack, "p2")).start(); + new Thread(new Consumer(stack, "c2")).start(); + } + + static class Consumer implements Runnable { + private BlockingStack stack; + private String name; + + public Consumer(BlockingStack stack, String name) { + this.stack = stack; + this.name = name; + } + + @Override + public void run() { + for (int i = 0; i < 60; i++) { + Object o = stack.pop(); + System.err.println(name + " consume: " + o); + try { + Thread.sleep((long) (Math.random() * 400)); + } catch (InterruptedException e) {} + } + } + } + + static class Producer implements Runnable { + private BlockingStack stack; + private String name; + + public Producer(BlockingStack stack, String name) { + this.stack = stack; + this.name = name; + } + + @Override + public void run() { + for (int i = 0; i < 60; i++) { + String data = name + "-" + i; + stack.push(data); + System.out.println(name + " produce: " + data); + try { + Thread.sleep((long) (Math.random() * 100)); + } catch (InterruptedException e) {} + } + } + } +} diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Consumer.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Consumer.java deleted file mode 100644 index aa455e23..00000000 --- a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Consumer.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.hongxi.java.util.concurrent.sync; - -/** - * @author shenhongxi 2019/8/11 - */ -public class Consumer implements Runnable { - - private WorkStack stack; - private String name; - - public Consumer(WorkStack stack, String name) { - this.stack = stack; - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public void run() { - for (int i = 0; i < 60; i++) { - Work work = stack.pop(); - System.out.println(getName() + "消费" + work); - try { - Thread.sleep((long) (Math.random() * 400)); - } catch (InterruptedException e) {} - } - } -} diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Main.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Main.java deleted file mode 100644 index 3a691e99..00000000 --- a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Main.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.hongxi.java.util.concurrent.sync; - -/** - * @author shenhongxi 2019/8/11 - */ -public class Main { - - public static void main(String[] args) { - WorkStack stack = new WorkStack(); - - new Thread(new Producer(stack, "p1")).start(); - new Thread(new Consumer(stack, "c1")).start(); - new Thread(new Producer(stack, "p2")).start(); - new Thread(new Consumer(stack, "c2")).start(); - } -} diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Producer.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Producer.java deleted file mode 100644 index 83fbee13..00000000 --- a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Producer.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.hongxi.java.util.concurrent.sync; - -/** - * @author shenhongxi 2019/8/11 - */ -public class Producer implements Runnable { - - private WorkStack stack; - private String name; - - public Producer(WorkStack stack, String name) { - this.stack = stack; - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public void run() { - for (int i = 0; i < 60; i++) { - Work work = new Work(i); - stack.push(work); - System.out.println(getName() + "生产" + work); - try { - Thread.sleep((long) (Math.random() * 100)); - } catch (InterruptedException e) {} - } - } -} diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Work.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Work.java deleted file mode 100644 index 3248bc27..00000000 --- a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/Work.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.hongxi.java.util.concurrent.sync; - -/** - * @author shenhongxi 2019/8/11 - */ -public class Work { - - private int id; - - public Work(int id) { - this.id = id; - } - - public int getId() { - return id; - } - - @Override - public String toString() { - return "Work" + getId(); - } -} diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/WorkStack.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/WorkStack.java deleted file mode 100644 index b9c0a5a1..00000000 --- a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/sync/WorkStack.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.hongxi.java.util.concurrent.sync; - -/** - * @author shenhongxi 2019/8/11 - */ -public class WorkStack { - - private int index = 0; - private Work[] works = new Work[6]; - - public synchronized void push(Work work) { - while (index == works.length) { - try { - this.wait(); - } catch (InterruptedException e) {} - } - this.notifyAll(); - works[index++] = work; - } - - public synchronized Work pop() { - while (index == 0) { - try { - this.wait(); - } catch (InterruptedException e) {} - } - this.notifyAll(); - return works[--index]; - } -} -- GitLab