一个多线程顺序执行的Queue模型

来源:互联网 发布:bearychat mac 编辑:程序博客网 时间:2024/05/16 01:39
package cn.test.main;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class HandleQueue {    boolean done = false;    private final BlockingQueue<Action> queue;    ExecutorService es ;    int counter = 0;    public HandleQueue() {super();queue = new ArrayBlockingQueue<Action>(500, true);es = Executors.newSingleThreadExecutor();}    class TestCallback implements Callable<Boolean>{    private Action action;                public TestCallback(Action action) {              this.action = action;          }  @Overridepublic Boolean call() throws Exception {// TODO Auto-generated method stub System.out.println( "TaskId-"+action.id);for(int i = 0 ; i<10;i++){ System.out.println(Thread.currentThread().getName()+"call step-"+i); Thread.sleep(500);}return true;}        }         public void init(){  Thread t = new Thread() {            public void run() {            while (!done){                    Action action = nextAction();                    if (action != null) {                     counter++;                     Future <Boolean>  future =  es.submit(new TestCallback(new Action(counter)));                     try {if( future.get()){ System.out.println("执行成功"); }} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch blocke.printStackTrace();}                          if (queue.isEmpty()) {                                                      }                    }                }            }        };        t.start();} public void putAction(Action action) {        if (!done) {            try {             System.out.println("放入Action");                queue.put(action);            }            catch (InterruptedException ie) {                ie.printStackTrace();                return;            }            synchronized (queue) {                queue.notifyAll();            }             }    }  private Action nextAction() {   Action a= null;        // Wait until there's a Action or we're done.        while (!done && (a = queue.poll()) == null) {            try {                synchronized (queue) {                 queue.wait();                }            }            catch (InterruptedException ie) {            ie.printStackTrace();                // Do nothing            }        }        return a;    }/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubHandleQueue q = new HandleQueue();   q.init();for(int i = 0 ; i<10 ;i++){q.putAction(new Action(i));}}}

0 0
原创粉丝点击