queuetest2.java

来自「JGRoups源码」· Java 代码 · 共 235 行

JAVA
235
字号
package org.jgroups.tests;import EDU.oswego.cs.dl.util.concurrent.LinkedQueue;import EDU.oswego.cs.dl.util.concurrent.WaitFreeQueue;import org.jgroups.util.Queue;import org.jgroups.util.Queue2;import org.jgroups.util.QueueClosedException;import java.util.LinkedList;/** * * @author bela * Date: Jul 25, 2003 * Time: 2:14:32 PM */public class QueueTest2 {    Queueable q=null;    long  start, stop;    long  NUM=1000 * 1000;    void start(Queueable q, String msg) throws Exception {        this.q=q;        System.out.println("-- starting test with " + q.getClass() + " (" + msg + ')');        start=System.currentTimeMillis();        Adder adder=new Adder();        Remover remover=new Remover();        remover.start();        adder.start();        adder.join();        remover.join();        System.out.println("-- done with " + q.getClass());        System.out.println(" total time for " + NUM + " elements: " + (stop-start) + " msecs\n\n");    }    public interface Queueable {        void addElement(Object o);        Object removeElement();    }    class Adder extends Thread {        public void run() {            for(int i=0; i < NUM; i++) {                try {                    q.addElement(new Integer(i));                    //if(i % 1000 == 0)                      //  System.out.println("-- added " + i);                }                catch(Exception e) {                    e.printStackTrace();                }            }            //System.out.println("-- Adder: done");        }    }    class Remover extends Thread {        int i=0;        public void run() {            do {                try {                    q.removeElement();                    i++;                    //if(i % 1000 == 0)                      //  System.out.println("-- removed " + i);                }                catch(Exception e) {                    e.printStackTrace();                }            }            while(i < NUM);            stop=System.currentTimeMillis();            // System.out.println("-- Remover: done");        }    }    public static class JgQueue extends Queue implements Queueable {        public void addElement(Object o) {            try {                add(o);            }            catch(QueueClosedException e) {                e.printStackTrace();            }        }        public Object removeElement() {            try {                return remove();            }            catch(QueueClosedException e) {                e.printStackTrace();                return null;            }        }    }        public static class JgQueue2 extends Queue2 implements Queueable {        public void addElement(Object o) {            try {                add(o);            }            catch(QueueClosedException e) {                e.printStackTrace();            }        }        public Object removeElement() {            try {                return remove();            }            catch(QueueClosedException e) {                e.printStackTrace();                return null;            }        }    }    public static class MyQueue extends LinkedList implements Queueable {        Object mutex=new Object();        boolean waiting=false; // remover waiting on mutex        public void addElement(Object o) {            synchronized(mutex) {                super.add(o);                if(waiting)                    mutex.notifyAll(); // todo: change to notify()            }        }        public Object removeElement() {            synchronized(mutex) {                if(size() > 0) {                    return removeFirst();                }                else {                    waiting=true;                    try {                        mutex.wait();                        return removeFirst();                    }                    catch(InterruptedException e) {                        e.printStackTrace();                        return null;                    }                    finally {                        waiting=false;                    }                }            }        }    }    public static class MyLinkedQueue extends LinkedQueue implements Queueable {        public void addElement(Object o) {            try {                super.put(o);            }            catch(InterruptedException e) {                e.printStackTrace();            }        }        public Object removeElement() {            try {                return super.take();            }            catch(InterruptedException e) {                e.printStackTrace();                return null;            }        }    }      public static class MyWaitFreeQueue extends WaitFreeQueue implements Queueable {        public void addElement(Object o) {            try {                super.put(o);            }            catch(InterruptedException e) {                e.printStackTrace();            }        }        public Object removeElement() {            try {                return super.take();            }            catch(InterruptedException e) {                e.printStackTrace();                return null;            }        }    }    public static void main(String[] args) {        try {            QueueTest2 qt=new QueueTest2();            Queueable q=new JgQueue();            qt.start(q, "based on org.jgroups.util.Queue");            q=new JgQueue2();            qt.start(q, "based on org.jgroups.util.Queue2 (using util.concurrent Mutexes and CondVars)");            q=new MyQueue();            qt.start(q, "based on java.util.LinkedList");            q=new MyLinkedQueue();            qt.start(q, "based on EDU.oswego.cs.dl.util.concurrent.LinkedQueue");            q=new MyWaitFreeQueue();            qt.start(q, "based on EDU.oswego.cs.dl.util.concurrent.WaitFreeQueue");        }        catch(Throwable t) {            t.printStackTrace();        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?