diff --git a/java/base/build.gradle b/java/base/build.gradle index 8e4695b..fed266e 100644 --- a/java/base/build.gradle +++ b/java/base/build.gradle @@ -1,4 +1,10 @@ +repositories { + mavenCentral(); +} + dependencies { compile 'org.slf4j:slf4j-api:1.7.7' - compile 'org.slf4j:slf4j-log4j12:1.7.7' + compile 'org.slf4j:slf4j-log4j12:1.7.7' + compile 'org.picocontainer:picocontainer:2.15' + compile 'junit:junit:4.12' } \ No newline at end of file diff --git a/java/base/src/main/java/base/server/AbstractClient.java b/java/base/src/main/java/base/server/AbstractClient.java index b601b84..41215be 100644 --- a/java/base/src/main/java/base/server/AbstractClient.java +++ b/java/base/src/main/java/base/server/AbstractClient.java @@ -4,9 +4,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; -import base.worker.Worker; +import base.worker.ThreadWorker; -public abstract class AbstractClient extends Worker { +public abstract class AbstractClient extends ThreadWorker { protected Socket socket; protected InputStream inputStream; protected OutputStream outputStream; diff --git a/java/base/src/main/java/base/work/Listen.java b/java/base/src/main/java/base/work/Listen.java new file mode 100644 index 0000000..c7c10bf --- /dev/null +++ b/java/base/src/main/java/base/work/Listen.java @@ -0,0 +1,61 @@ +package base.work; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +import base.worker.DirectListener; +import base.worker.ThreadListener; +import base.worker.Worker; +import base.worker.pool.Listener; +import base.worker.pool.ListenerPool; +import base.worker.pool.PooledListener; + +public abstract class Listen extends Work { + protected Listener listener; + public Queue queue; + + public Listen() { + this(WORKER_TYPE); + } + + protected Listen(Worker.Type workerType) { + switch (workerType) { + case DIRECT: + listener = new DirectListener(this); + break; + default: + case THREAD: + listener = new ThreadListener(this); + break; + } + queue = new ConcurrentLinkedQueue(); + } + + protected Listen(Worker worker) { + this.work = worker; + queue = new ConcurrentLinkedQueue(); + } + + protected Listen(ListenerPool listenerPool) { + listener = new PooledListener(this); + listenerPool.add((PooledListener) listener); + queue = new ConcurrentLinkedQueue(); + } + + public synchronized void add(E element) { + listener.add(element); + } + + public void work() { + while (!queue.isEmpty()) { + input(queue.poll()); + } + synchronized (this) { + try { + wait(); + } catch (InterruptedException e) {} + } + } + + public void input(E element) {} +} diff --git a/java/base/src/main/java/base/work/Work.java b/java/base/src/main/java/base/work/Work.java new file mode 100644 index 0000000..d371adb --- /dev/null +++ b/java/base/src/main/java/base/work/Work.java @@ -0,0 +1,56 @@ +package base.work; + +import base.exception.worker.ActivateException; +import base.exception.worker.DeactivateException; +import base.worker.DirectWorker; +import base.worker.ThreadWorker; +import base.worker.Worker; +import base.worker.pool.PooledWorker; +import base.worker.pool.WorkerPool; + +public abstract class Work { + protected static final Worker.Type WORKER_TYPE = Worker.Type.THREAD; + + protected Worker work; + + protected Work() { + this(WORKER_TYPE); + } + + protected Work(Worker.Type workerType) { + switch (workerType) { + case DIRECT: + work = new DirectWorker(this); + break; + default: + case THREAD: + work = new ThreadWorker(this); + break; + } + } + + protected Work(Worker worker) { + this.work = worker; + } + + protected Work(WorkerPool workerPool) { + work = new PooledWorker(this); + workerPool.add((PooledWorker) work); + } + + protected void sleep(int time) { + work.sleep(time); + } + + public void start() { + work.start(); + } + + public void stop() { + work.stop(); + } + + public void activate() throws ActivateException {} + public void deactivate() throws DeactivateException {} + public abstract void work(); +} diff --git a/java/base/src/main/java/base/worker/AbstractWorker.java b/java/base/src/main/java/base/worker/AbstractWorker.java deleted file mode 100644 index 0d8f101..0000000 --- a/java/base/src/main/java/base/worker/AbstractWorker.java +++ /dev/null @@ -1,9 +0,0 @@ -package base.worker; - -public abstract class AbstractWorker { - public abstract void start(); - - public abstract void stop(); - - protected abstract void work(); -} diff --git a/java/base/src/main/java/base/worker/DirectIntervalWorker.java b/java/base/src/main/java/base/worker/DirectIntervalWorker.java new file mode 100644 index 0000000..1bc7dd8 --- /dev/null +++ b/java/base/src/main/java/base/worker/DirectIntervalWorker.java @@ -0,0 +1,14 @@ +package base.worker; + +import base.work.Work; + +public class DirectIntervalWorker extends ThreadIntervalWorker { + public DirectIntervalWorker(Work work, int interval) { + super(work, false); + this.interval = interval; + } + + public DirectIntervalWorker(IntervalWork intervalWork) { + super(intervalWork); + } +} diff --git a/java/base/src/main/java/base/worker/DirectListener.java b/java/base/src/main/java/base/worker/DirectListener.java new file mode 100644 index 0000000..70aa999 --- /dev/null +++ b/java/base/src/main/java/base/worker/DirectListener.java @@ -0,0 +1,16 @@ +package base.worker; + +import base.work.Listen; +import base.worker.pool.Listener; + +public class DirectListener extends ThreadListener implements Listener { + public DirectListener(Listen listen) { + super(listen, false); + } + + @Override + public void add(Object element) { + // TODO Auto-generated method stub + + } +} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/DirectWorker.java b/java/base/src/main/java/base/worker/DirectWorker.java new file mode 100644 index 0000000..bf01b50 --- /dev/null +++ b/java/base/src/main/java/base/worker/DirectWorker.java @@ -0,0 +1,9 @@ +package base.worker; + +import base.work.Work; + +public class DirectWorker extends ThreadWorker { + public DirectWorker(Work work) { + super(work, false); + } +} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/IntervalWork.java b/java/base/src/main/java/base/worker/IntervalWork.java new file mode 100644 index 0000000..9f5f697 --- /dev/null +++ b/java/base/src/main/java/base/worker/IntervalWork.java @@ -0,0 +1,37 @@ +package base.worker; + +import base.work.Work; + +public abstract class IntervalWork extends Work { + protected IntervalWork() { + this(WORKER_TYPE); + } + + protected IntervalWork(int interval) { + this(WORKER_TYPE, interval); + } + + protected IntervalWork(Worker.Type workerType) { + switch (workerType) { + case DIRECT: + work = new DirectIntervalWorker(this); + break; + default: + case THREAD: + work = new ThreadIntervalWorker(this); + break; + } + } + + protected IntervalWork(Worker.Type workerType, int interval) { + switch (workerType) { + case DIRECT: + work = new DirectIntervalWorker(this, interval); + break; + default: + case THREAD: + work = new ThreadIntervalWorker(this, interval); + break; + } + } +} diff --git a/java/base/src/main/java/base/worker/IntervalWorker.java b/java/base/src/main/java/base/worker/IntervalWorker.java deleted file mode 100644 index a98066b..0000000 --- a/java/base/src/main/java/base/worker/IntervalWorker.java +++ /dev/null @@ -1,81 +0,0 @@ -package base.worker; - -import java.util.Timer; -import java.util.TimerTask; - -import base.exception.worker.ActivateException; -import base.exception.worker.DeactivateException; - -public class IntervalWorker extends Worker { - protected static final boolean THREAD = true; - protected static final int INTERVAL = 500; - - protected Timer timer; - - public synchronized void start(boolean thread) { - if (!active) { - activate = true; - timer = new Timer(); - timer.schedule(new TimerTask() { - public void run() { - IntervalWorker.this.run(); - }}, 0, INTERVAL); - active = true; - } - if (!thread) { - try { - synchronized (this) { - wait(); - } - } catch (InterruptedException e) { - logger.info("", e); - } - } - } - - public synchronized void stop() { - if (active) { - timer.cancel(); - deactivate = true; - run(); - notifyAll(); - } - } - - public void run() { - if (activate && !active) { - try { - super.activate(); - } catch (ActivateException e) { - logger.error("", e); - } finally { - activate = false; - } - } else if (deactivate && active) { - try { - super.deactivate(); - } catch (DeactivateException e) { - logger.error("", e); - } finally { - deactivate = false; - } - } - if (active) { - work(); - } - } - - protected void work() { - System.out.println("(-:"); - } - - public static void main(String[] args) { - IntervalWorker intervalWorker = new IntervalWorker(); - for (int i = 0; i < 3; ++i) { - intervalWorker.start(false); - System.out.println("--"); - intervalWorker.sleep(200); - intervalWorker.stop(); - } - } -} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/Listener.java b/java/base/src/main/java/base/worker/Listener.java deleted file mode 100644 index 86cff8f..0000000 --- a/java/base/src/main/java/base/worker/Listener.java +++ /dev/null @@ -1,35 +0,0 @@ -package base.worker; - -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - - -public abstract class Listener extends Worker { - protected Queue queue; - - public Listener() { - queue = new ConcurrentLinkedQueue(); - } - - public synchronized void add(E element) { - queue.add(element); - notifyAll(); - } - - public final void work() { - while (!queue.isEmpty()) { - input(queue.poll()); - } - if (!deactivate) { - synchronized (this) { - try { - wait(); - } catch (InterruptedException e) { - logger.info("", e); - } - } - } - } - - public abstract void input(E element); -} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/ThreadIntervalWorker.java b/java/base/src/main/java/base/worker/ThreadIntervalWorker.java new file mode 100644 index 0000000..367cacd --- /dev/null +++ b/java/base/src/main/java/base/worker/ThreadIntervalWorker.java @@ -0,0 +1,61 @@ +package base.worker; + +import java.util.Timer; +import java.util.TimerTask; + +import base.work.Work; + +public class ThreadIntervalWorker extends ThreadWorker { + protected static final int INTERVAL = 500; + protected int interval; + + public ThreadIntervalWorker(Work work) { + super(work); + interval = INTERVAL; + } + + public ThreadIntervalWorker(Work work, boolean thread) { + super(work, thread); + interval = INTERVAL; + } + + public ThreadIntervalWorker(Work work, int interval) { + super(work); + this.interval = interval; + } + + protected Timer timer; + + public synchronized void start(boolean thread) { + if (!active) { + activate = true; + timer = new Timer(); + timer.schedule(new TimerTask() { + public void run() { + Worker worker = ThreadIntervalWorker.this; + worker.runActivate(); + worker.runDeactivate(); + worker.runWork(); + }}, 0, interval); + active = true; + } + if (!thread) { + try { + synchronized (this) { + wait(); + } + } catch (InterruptedException e) { + logger.info("", e); + } + } + } + + public synchronized void stop() { + if (active) { + timer.cancel(); + deactivate = true; + run(); + notifyAll(); + } + } +} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/ThreadListener.java b/java/base/src/main/java/base/worker/ThreadListener.java new file mode 100644 index 0000000..79d7863 --- /dev/null +++ b/java/base/src/main/java/base/worker/ThreadListener.java @@ -0,0 +1,22 @@ +package base.worker; + +import base.work.Listen; +import base.worker.pool.Listener; + +public class ThreadListener extends ThreadWorker implements Listener { + protected Listen listen; + + public ThreadListener(Listen listen) { + super(listen); + this.listen = listen; + } + + public ThreadListener(Listen listen, boolean start) { + super(listen); + } + + public void add(E element) { + System.out.println("ok! " + element); + listen.queue.add(element); + } +} diff --git a/java/base/src/main/java/base/worker/ThreadWorker.java b/java/base/src/main/java/base/worker/ThreadWorker.java new file mode 100644 index 0000000..1ebfb2e --- /dev/null +++ b/java/base/src/main/java/base/worker/ThreadWorker.java @@ -0,0 +1,52 @@ +package base.worker; + +import base.work.Work; + +public class ThreadWorker extends Worker implements Runnable { + protected static final boolean THREAD = true; + + protected boolean thread = true; + + public ThreadWorker(Work work, boolean thread) { + this(work); + this.thread = thread; + } + + public ThreadWorker(Work work) { + super(work); + } + + public synchronized void start(boolean thread) { + if (!active) { + activate = true; + } + if (!run) { + run = true; + if (thread) { + logger.debug("Start thread"); + new Thread(this, getClass().getName()).start(); + } else { + logger.debug("Run directly"); + run(); + } + } else { + notifyAll(); + } + } + + public synchronized void start() { + start(thread); + } + + public synchronized void stop() { + if (active) { + deactivate = true; + } + notifyAll(); + } + + public void exit() { + stop(); + run = false; + } +} diff --git a/java/base/src/main/java/base/worker/Worker.java b/java/base/src/main/java/base/worker/Worker.java index 8def0d5..2df4424 100644 --- a/java/base/src/main/java/base/worker/Worker.java +++ b/java/base/src/main/java/base/worker/Worker.java @@ -5,62 +5,89 @@ import org.slf4j.LoggerFactory; import base.exception.worker.ActivateException; import base.exception.worker.DeactivateException; +import base.work.Work; -public abstract class Worker implements Runnable { +public abstract class Worker { + public enum Type { + DIRECT, THREAD, POOLED + } + + protected static final int SLEEP = 100; + protected Logger logger = LoggerFactory.getLogger(getClass()); - protected static final boolean THREAD = true; - protected static final int SLEEP = 100; - - protected boolean thread = true; protected boolean run = false; protected boolean active = false; protected boolean activate = false; protected boolean deactivate = false; - public Worker(boolean thread) { - this.thread = thread; + protected Work work; + + public Worker(Work work) { + this.work = work; + } + + public abstract void start(); + + public abstract void stop(); + + public boolean active() { + return active; } - public Worker() { - this(THREAD); - } - - public synchronized void start(boolean thread) { - if (!active) { - activate = true; + public void run() { + while (run || deactivate) { + runActivate(); + runDeactivate(); + runWork(); } - if (!run) { - run = true; - if (thread) { - logger.debug("Start thread"); - new Thread(this, getClass().getName()).start(); - } else { - logger.debug("Run directly"); - run(); + } + + public void runActivate() { + if (activate && !active) { + try { + work.activate(); + } catch (ActivateException e) { + logger.error("", e); + } finally { + activate = false; + active = true; + } + } + } + + public void runDeactivate() { + if (deactivate && active) { + try { + work.deactivate(); + } catch (DeactivateException e) { + logger.error("", e); + } finally { + deactivate = false; + active = false; } - } else { - notifyAll(); } } - public synchronized void start() { - start(thread); - } - - public synchronized void stop() { + public void runWork() { if (active) { - deactivate = true; + work.work(); + } else if (run) { + try { + synchronized (this) { + wait(); + } + } catch (InterruptedException e) { + logger.info("", e); + } } - notifyAll(); } - public void exit() { - stop(); - run = false; + protected void sleep() { + sleep(SLEEP); } - protected void sleep(int time) { + public void sleep(int time) { try { if (time > 0) { Thread.sleep(time); @@ -69,55 +96,4 @@ public abstract class Worker implements Runnable { logger.info("", e); } } - - protected void sleep() { - sleep(SLEEP); - } - - public boolean active() { - return active; - } - - protected void activate() throws ActivateException { - active = true; - } - - protected void deactivate() throws DeactivateException { - active = false; - } - - public void run() { - while (run || deactivate) { - if (activate && !active) { - try { - activate(); - } catch (ActivateException e) { - logger.error("", e); - } finally { - activate = false; - } - } else if (deactivate && active) { - try { - deactivate(); - } catch (DeactivateException e) { - logger.error("", e); - } finally { - deactivate = false; - } - } - if (active) { - work(); - } else if (run) { - try { - synchronized (this) { - wait(); - } - } catch (InterruptedException e) { - logger.info("", e); - } - } - } - } - - protected abstract void work(); } diff --git a/java/base/src/main/java/base/worker/pool/Listener.java b/java/base/src/main/java/base/worker/pool/Listener.java new file mode 100644 index 0000000..581b695 --- /dev/null +++ b/java/base/src/main/java/base/worker/pool/Listener.java @@ -0,0 +1,5 @@ +package base.worker.pool; + +public interface Listener { + public void add(E element); +} diff --git a/java/base/src/main/java/base/worker/pooled/ListenerPool.java b/java/base/src/main/java/base/worker/pool/ListenerPool.java similarity index 87% rename from java/base/src/main/java/base/worker/pooled/ListenerPool.java rename to java/base/src/main/java/base/worker/pool/ListenerPool.java index 998764f..8f9e266 100644 --- a/java/base/src/main/java/base/worker/pooled/ListenerPool.java +++ b/java/base/src/main/java/base/worker/pool/ListenerPool.java @@ -1,9 +1,9 @@ -package base.worker.pooled; +package base.worker.pool; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; public class ListenerPool { @@ -13,7 +13,7 @@ public class ListenerPool { public ListenerPool(int poolSize) { this.poolSize = poolSize; - queue = new SynchronousQueue>(); + queue = new LinkedBlockingQueue>(); executorService = Executors.newFixedThreadPool(poolSize); } diff --git a/java/base/src/main/java/base/worker/pooled/ListenerPoolRunnable.java b/java/base/src/main/java/base/worker/pool/ListenerPoolRunnable.java similarity index 95% rename from java/base/src/main/java/base/worker/pooled/ListenerPoolRunnable.java rename to java/base/src/main/java/base/worker/pool/ListenerPoolRunnable.java index b4227e3..ab60177 100644 --- a/java/base/src/main/java/base/worker/pooled/ListenerPoolRunnable.java +++ b/java/base/src/main/java/base/worker/pool/ListenerPoolRunnable.java @@ -1,4 +1,4 @@ -package base.worker.pooled; +package base.worker.pool; import java.util.concurrent.BlockingQueue; diff --git a/java/base/src/main/java/base/worker/pool/PooledListener.java b/java/base/src/main/java/base/worker/pool/PooledListener.java new file mode 100644 index 0000000..8b458a1 --- /dev/null +++ b/java/base/src/main/java/base/worker/pool/PooledListener.java @@ -0,0 +1,28 @@ +package base.worker.pool; + +import java.util.concurrent.BlockingQueue; + +import base.work.Listen; + +public class PooledListener extends PooledWorker implements Listener { + protected BlockingQueue> poolQueue; + protected Listen listen; + + public PooledListener(Listen listen) { + super(listen); + this.listen = listen; + } + + public void setPoolQueue(BlockingQueue> poolQueue) { + this.poolQueue = poolQueue; + } + + public synchronized void add(E element) { + Wrapper wrapper = new Wrapper(this, element); + poolQueue.add(wrapper); + } + + void input(E element) { + listen.input(element); + } +} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/pooled/PooledWorker.java b/java/base/src/main/java/base/worker/pool/PooledWorker.java similarity index 85% rename from java/base/src/main/java/base/worker/pooled/PooledWorker.java rename to java/base/src/main/java/base/worker/pool/PooledWorker.java index 82a2a50..13afee3 100644 --- a/java/base/src/main/java/base/worker/pooled/PooledWorker.java +++ b/java/base/src/main/java/base/worker/pool/PooledWorker.java @@ -1,13 +1,18 @@ -package base.worker.pooled; +package base.worker.pool; import java.util.concurrent.BlockingQueue; +import base.work.Work; import base.worker.Worker; -public abstract class PooledWorker extends Worker { +public class PooledWorker extends Worker { protected BlockingQueue activateQueue; protected BlockingQueue deactivateQueue; + public PooledWorker(Work work) { + super(work); + } + public void setActivateQueue(BlockingQueue activateQueue) { this.activateQueue = activateQueue; } diff --git a/java/base/src/main/java/base/worker/pooled/WorkerPool.java b/java/base/src/main/java/base/worker/pool/WorkerPool.java similarity index 97% rename from java/base/src/main/java/base/worker/pooled/WorkerPool.java rename to java/base/src/main/java/base/worker/pool/WorkerPool.java index dd342d7..a8bdb8c 100644 --- a/java/base/src/main/java/base/worker/pooled/WorkerPool.java +++ b/java/base/src/main/java/base/worker/pool/WorkerPool.java @@ -1,4 +1,4 @@ -package base.worker.pooled; +package base.worker.pool; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; diff --git a/java/base/src/main/java/base/worker/pooled/WorkerPoolRunnable.java b/java/base/src/main/java/base/worker/pool/WorkerPoolRunnable.java similarity index 95% rename from java/base/src/main/java/base/worker/pooled/WorkerPoolRunnable.java rename to java/base/src/main/java/base/worker/pool/WorkerPoolRunnable.java index d442fc2..67c1886 100644 --- a/java/base/src/main/java/base/worker/pooled/WorkerPoolRunnable.java +++ b/java/base/src/main/java/base/worker/pool/WorkerPoolRunnable.java @@ -1,4 +1,4 @@ -package base.worker.pooled; +package base.worker.pool; import java.util.concurrent.BlockingQueue; @@ -34,7 +34,7 @@ public class WorkerPoolRunnable implements Runnable { } catch (InterruptedException e) {} } else { Worker worker = workerCycle.next(); - worker.work(); + worker.runWork(); } } } diff --git a/java/base/src/main/java/base/worker/pooled/Wrapper.java b/java/base/src/main/java/base/worker/pool/Wrapper.java similarity index 90% rename from java/base/src/main/java/base/worker/pooled/Wrapper.java rename to java/base/src/main/java/base/worker/pool/Wrapper.java index f447bd6..f62ce74 100644 --- a/java/base/src/main/java/base/worker/pooled/Wrapper.java +++ b/java/base/src/main/java/base/worker/pool/Wrapper.java @@ -1,4 +1,4 @@ -package base.worker.pooled; +package base.worker.pool; class Wrapper { diff --git a/java/base/src/main/java/base/worker/pooled/PooledListener.java b/java/base/src/main/java/base/worker/pooled/PooledListener.java deleted file mode 100644 index db7c379..0000000 --- a/java/base/src/main/java/base/worker/pooled/PooledListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package base.worker.pooled; - -import java.util.concurrent.BlockingQueue; - -public abstract class PooledListener { - protected BlockingQueue> poolQueue; - - public void setPoolQueue(BlockingQueue> poolQueue) { - this.poolQueue = poolQueue; - } - - public synchronized void add(E element) { - Wrapper wrapper = new Wrapper(this, element); - poolQueue.add(wrapper); - } - - abstract void input(E element); -} \ No newline at end of file diff --git a/java/base/src/main/java/base/worker/pooled/TestPooledWorker.java b/java/base/src/main/java/base/worker/pooled/TestPooledWorker.java deleted file mode 100644 index 36079e4..0000000 --- a/java/base/src/main/java/base/worker/pooled/TestPooledWorker.java +++ /dev/null @@ -1,80 +0,0 @@ -package base.worker.pooled; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import base.exception.worker.ActivateException; -import base.exception.worker.DeactivateException; -import base.worker.Worker; - -public class TestPooledWorker extends PooledWorker { - protected int id; - protected volatile int work; - - public TestPooledWorker(int id) { - this.id = id; - } - - protected void setWork(int work) { - System.out.println("#" + id + ", set work @ " + work); - this.work = work; - } - - public void work() { - System.out.println("#" + id + ", work = " + work); - if (--work < 1) { - stop(); - } - sleep(300); - } - - protected void activate() throws ActivateException { - System.out.println("#" + id + ", activating..."); - super.activate(); - } - - protected void deactivate() throws DeactivateException { - super.deactivate(); - System.out.println("#" + id + ", deactivating..."); - } - - public static void main(String[] args) { - WorkerPool workerPool = new WorkerPool(3); - - List workerList = new ArrayList(); - for (int i = 0; i < 10; ++i) { - TestPooledWorker worker = new TestPooledWorker(i + 1); - workerPool.add(worker); - workerList.add(worker); - } - workerPool.start(); - - System.out.println("Starting work!"); - int work = 1000; - ArrayList activeWorkerList = new ArrayList(); - for (int i = 0; i < 8; ++i) { - TestPooledWorker worker = workerList.get((new Random()).nextInt(workerList.size())); - worker.setWork(work); - worker.start(); - activeWorkerList.add(worker); - } - int i = 0; - - - try { - Thread.sleep(2000); - } catch (InterruptedException e) {} - - for (Worker worker : activeWorkerList) { - if (++i > 5) { - break; - } - worker.stop(); - } - try { - Thread.sleep(100000); - } catch (InterruptedException e) {} - System.exit(0); - } -} diff --git a/java/base/src/test/java/worker/TestDirectWork.java b/java/base/src/test/java/worker/TestDirectWork.java new file mode 100644 index 0000000..b736f2c --- /dev/null +++ b/java/base/src/test/java/worker/TestDirectWork.java @@ -0,0 +1,15 @@ +package worker; + +import worker.dummy.DummyWork; + + +public class TestDirectWork { + public static void main(String[] args) { + DummyWork work = new DummyWork(1); + work.setWork(100); + work.start(); + try { + Thread.sleep(10000); + } catch (InterruptedException e) {} + } +} diff --git a/java/base/src/test/java/worker/TestIntervalWork.java b/java/base/src/test/java/worker/TestIntervalWork.java new file mode 100644 index 0000000..6ac9f7d --- /dev/null +++ b/java/base/src/test/java/worker/TestIntervalWork.java @@ -0,0 +1,18 @@ +package worker; + +import worker.dummy.DummyIntervalWork; +import base.work.Work; + +public class TestIntervalWork { + public static void main(String[] args) { + Work work = new DummyIntervalWork(500); + for (int i = 0; i < 10; ++i) { + work.start(); + System.out.println("--"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) {} + work.stop(); + } + } +} diff --git a/java/base/src/test/java/worker/TestListen.java b/java/base/src/test/java/worker/TestListen.java new file mode 100644 index 0000000..c2e43b6 --- /dev/null +++ b/java/base/src/test/java/worker/TestListen.java @@ -0,0 +1,19 @@ +package worker; + +import worker.dummy.DummyListen; + +public class TestListen { + public static void main(String[] args) { + DummyListen listen = new DummyListen(0); + listen.start(); + for (int i = 0; i < 10; ++i) { + listen.add(i); + try { + Thread.sleep(1000); + } catch (InterruptedException e) {} + } + try { + Thread.sleep(10000); + } catch (InterruptedException e) {} + } +} diff --git a/java/base/src/main/java/base/worker/pooled/TestPooledListener.java b/java/base/src/test/java/worker/TestPooledListen.java similarity index 50% rename from java/base/src/main/java/base/worker/pooled/TestPooledListener.java rename to java/base/src/test/java/worker/TestPooledListen.java index d8aa4b7..9e054e3 100644 --- a/java/base/src/main/java/base/worker/pooled/TestPooledListener.java +++ b/java/base/src/test/java/worker/TestPooledListen.java @@ -1,13 +1,16 @@ -package base.worker.pooled; +package worker; import java.util.ArrayList; import java.util.List; import java.util.Random; -public class TestPooledListener extends PooledListener { +import worker.dummy.DummyListen; +import base.worker.pool.ListenerPool; + +public class TestPooledListen { protected int id; - public TestPooledListener(int id) { + public TestPooledListen(int id) { this.id = id; } @@ -16,21 +19,20 @@ public class TestPooledListener extends PooledListener { } public static void main(String[] args) { - ListenerPool listenerPool = new ListenerPool(5); - List> listenerList = new ArrayList>(); + ListenerPool listenerPool = new ListenerPool(5); + List listenList = new ArrayList(); for (int i = 0; i < 20; ++i) { - PooledListener pooledListener = listenerPool.add(new TestPooledListener(i + 1)); - listenerList.add(pooledListener); + DummyListen listen = new DummyListen(listenerPool, i + 1); + listenList.add(listen); } - listenerPool.start(); System.out.println("Starting to give out elements!"); for (int i = 0; i < 100; ++i) { - PooledListener randomListener = listenerList.get((new Random()).nextInt(listenerList.size())); - randomListener.add(i); + DummyListen randomListen = listenList.get((new Random()).nextInt(listenList.size())); + randomListen.add(i); } - + //listenerPool.await(); } } diff --git a/java/base/src/test/java/worker/TestPooledWork.java b/java/base/src/test/java/worker/TestPooledWork.java new file mode 100644 index 0000000..aa932fd --- /dev/null +++ b/java/base/src/test/java/worker/TestPooledWork.java @@ -0,0 +1,45 @@ +package worker; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import worker.dummy.DummyWork; +import base.work.Work; +import base.worker.pool.WorkerPool; + +public class TestPooledWork { + public static void main(String[] args) { + WorkerPool workerPool = new WorkerPool(3); + + List workList = new ArrayList(); + for (int i = 0; i < 10; ++i) { + DummyWork work = new DummyWork(workerPool, i + 1); + workList.add(work); + } + workerPool.start(); + + System.out.println("Starting work!"); + ArrayList activeWorkList = new ArrayList(); + for (int i = 0; i < 8; ++i) { + DummyWork work = workList.get((new Random()).nextInt(workList.size())); + work.setWork(1000); + work.start(); + activeWorkList.add(work); + } + try { + Thread.sleep(2000); + } catch (InterruptedException e) {} + int i = 0; + for (Work work : activeWorkList) { + if (++i > 5) { + break; + } + work.stop(); + } + try { + Thread.sleep(100000); + } catch (InterruptedException e) {} + System.exit(0); + } +} diff --git a/java/base/src/test/java/worker/dummy/DummyIntervalWork.java b/java/base/src/test/java/worker/dummy/DummyIntervalWork.java new file mode 100644 index 0000000..5bc9bba --- /dev/null +++ b/java/base/src/test/java/worker/dummy/DummyIntervalWork.java @@ -0,0 +1,13 @@ +package worker.dummy; + +import base.worker.IntervalWork; + +public class DummyIntervalWork extends IntervalWork { + public DummyIntervalWork(int interval) { + super(interval); + } + + public void work() { + System.out.println(":-)"); + } +} \ No newline at end of file diff --git a/java/base/src/test/java/worker/dummy/DummyListen.java b/java/base/src/test/java/worker/dummy/DummyListen.java new file mode 100644 index 0000000..65c1270 --- /dev/null +++ b/java/base/src/test/java/worker/dummy/DummyListen.java @@ -0,0 +1,22 @@ +package worker.dummy; + +import base.work.Listen; +import base.worker.pool.ListenerPool; + +public class DummyListen extends Listen { + protected int id; + + public DummyListen(ListenerPool listenerPool, int id) { + super(listenerPool); + this.id = id; + } + + public DummyListen(int id) { + super(); + this.id = id; + } + + public void input(Integer input) { + System.out.println("#" + id + ", input = " + input); + } +} diff --git a/java/base/src/test/java/worker/dummy/DummyWork.java b/java/base/src/test/java/worker/dummy/DummyWork.java new file mode 100644 index 0000000..4dbf7da --- /dev/null +++ b/java/base/src/test/java/worker/dummy/DummyWork.java @@ -0,0 +1,42 @@ +package worker.dummy; + +import base.exception.worker.ActivateException; +import base.exception.worker.DeactivateException; +import base.work.Work; +import base.worker.pool.WorkerPool; + +public class DummyWork extends Work { + protected int id; + protected volatile int work; + + public DummyWork(int id) { + super(); + this.id = id; + } + + public DummyWork(WorkerPool workerPool, int id) { + super(workerPool); + this.id = id; + } + + public void setWork(int work) { + System.out.println("#" + id + ", set work @ " + work); + this.work = work; + } + + public void work() { + System.out.println("#" + id + ", work = " + work); + if (--work < 1) { + stop(); + } + sleep(300); + } + + public void activate() throws ActivateException { + System.out.println("#" + id + ", activating..."); + } + + public void deactivate() throws DeactivateException { + System.out.println("#" + id + ", deactivating..."); + } +}