公司要做一个客服系统,每个客户请求来时都放在一个队列里面,等待安排给一个线程外理。
假设有5个请求按顺序来了,并且把它们都放进了队列里面,代码如下:
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
public class Test {
public static void main(String[] args) {
Thread t1 = new MyThread("t1");
Thread t2 = new MyThread("t2");
Thread t3 = new MyThread("t3");
Thread t4 = new MyThread("t4");
Thread t5 = new MyThread("t5");
Queue<Thread> q = new ArrayBlockingQueue<Thread>(100);
q.offer(t1);
q.offer(t2);
q.offer(t3);
q.offer(t4);
q.offer(t5);
System.out.println("q.size = " + q.size());
int queueSize = q.size();
for(int i = 0; i < queueSize; i++) {
System.out.println("i = " + i);
Thread t = q.poll();
t.start();
}
}
}
class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.currentThread().getName());
}
}
以上代码虽然把每个请求(也就是线程对象)放进了队列里面,但是输出的结果却不是按顺序输出!
原因是start()方法并不保证线程马上执行,这样的话就不能做到先进先出的目标了,请求应该如何改进?谢谢!
------解决方案--------------------
要并行的话,还要求先进先出,就可能会有违初衷,也许有的处理时间长,有的短。
要先进先出的话,你就顺序执行,可以参考这个:
ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();
for(int i =0;i<5;i++){
EXECUTOR.execute(new MyRun("thread"+i));
}
EXECUTOR.shutdown();