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;
}
@Override
public 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 block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.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 stub
HandleQueue q = new HandleQueue();
q.init();
for(int i = 0 ; i<10 ;i++){
q.putAction(new Action(i));
}
}
}
一个多线程顺序执行的Queue模型
最新推荐文章于 2024-03-25 20:22:10 发布