请教各位一个问题,在使用多线程处理集合时,需要设定一个nThreads,请问如下方式是否会与全局(xml文件)设定的线程池冲突?
int dealSize = 200000; // 每次处理的数量 int index = 0; // 每组的起点下标 int nThreads = 5; // 线程数量 ExecutorService service = Executors.newFixedThreadPool(nThreads); List<Future<List<String>>> futures = new LinkedList<Future<List<String>>>(); for (int i = 0; i < nThreads; i++) { int start = index; index += dealSize; if (start >= list.size()) break; int end = start + dealSize; end = end > list.size() ? list.size() : end; futures.add(service.submit(new Task(list, start, end))); }
不会,java的线程池和.net默认的线程池不一样
谢谢你的回复!
1. new 出来的线程确实不会与全局线程池里的线程相冲突
2. new 出来的线程是新创建线程,这样一来整个项目中的线程不是增多了么?
3. 我记得有一个规约:不要新建线程,应该从线程池中取,而此处应该用何种方式取线程呢?
我百度了不少,没有找到合适的答案,如果你知道,能不能麻烦你有空的时候指点一二,不胜感激!
@zhoupengqin: 你现在这种方式就是使用线程池的线程啊,通过future/promise将需要执行的信息交由线程池去完成。
这里你如果用fixed的线程池和直接其若干线程差别在于前者会在你需要更多线程时才会实例化新线程(不超过线程池设定线程数上限)。
是否需要显式new线程这个需要看场景,不好一概而论。一般类似你代码的场景(任务数量未知或者较多)下还是用线程池,如果仅仅是个简单的周期性的玩意,new线程和使用Executors#newScheduledThreadPool等等也差不多。
@Daniel Cai: 谢谢。这确实是一个短期的任务,需要及时的处理、反馈,所以最终选择了创建一个临时的局部线程池,每次执行完一个任务周期,就关闭一次线程池。