当前位置: 代码迷 >> J2SE >> 线程优先级有关问题,多谢
  详细解决方案

线程优先级有关问题,多谢

热度:72   发布时间:2016-04-23 20:37:02.0
线程优先级问题,谢谢!
公司要做一个客服系统,每个客户请求来时都放在一个队列里面,等待安排给一个线程外理。
假设有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();
  相关解决方案