import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MyExecutor extends Thread {
String name; public MyExecutor(String s) throws MalformedURLException, RemoteException,
NotBoundException {
this.name = s;
} public void run() {
try {
System.out.println(Thread.currentThread().getName());
System.out.println(" start....");
System.out.println(name);
System.out.println("result:" + s);
Thread.sleep((int) (Math.random() * 1000));
System.out.println(" end...");
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String args[]) throws MalformedURLException,
RemoteException, NotBoundException {
ExecutorService service = Executors.newFixedThreadPool(4); Queue<String> allTasks = new ConcurrentLinkedQueue<String>();
allTasks.offer("1111");
allTasks.offer("2222");
allTasks.offer("3333");
allTasks.offer("4444");
allTasks.offer("5555");
allTasks.offer("6666"); String str; while ((str = allTasks.poll()) != null) {
service.execute(new MyExecutor(str));
System.out.println(str);
} System.out.println("submit finish");
service.shutdown();
}
}
上述代码是用concurrent包写了个多线程,请问下有什么问题没?

解决方案 »

  1.   

    目测没啥问题,LZ想测什么场景呢?CPU处理速度很快的,你的简单线程也许一execute就完成了,不会超出队列的。
      

  2.   

    不好意思,没注意还有句:Thread.sleep((int) (Math.random() * 1000));
    这样就会超过4个线程了,呵呵
      

  3.   

    System.out.println("result:" + name);
      

  4.   

    现在有个问题就是在线程中调用外部方法,这个方法会返回个字符串("true"或"false"),如果为false的话,要停止队列的循环,该如何实现?
      

  5.   


    你是要停止队列循环,加个voliate isRunning=true的标志就行了啊while(isRunning&&xxxxx){
    ....
    }
    当你的线程返回字符串为false时,改变isRunning=false则可以停止掉你队列的循环。ps:楼主这里最好将allTasks.poll放到while循环里面,这里你的while条件来看,你的程序在跑完线程后,自动就会结束掉你的队列循环。
    还有一种停止掉你队列的循环是,在你的线程中加入一个结束消息,例如结束消息为str="End"
    然后再你的循环中每次去判断
    if("End".equals(result)){
    break;
    }
    若是,则break掉你的循环。