web项目中正确使用线程池的方法
应该是创建一个静态变量的线程池,然后不要每次都去new一个局部变量,有线程时都丢到这个线程池中去跑。
static final ExecutorService executors = Executors.newCachedThreadPool();
但是使用静态变量的线程池会出现一个问题,就是不能对线程池进行shutdown,否则线程任务就submit不进去了。
所以一般静态变量共用的线程池是不shutdown的。
也就是无法通过如下方法知道线程是否运行结束了:
TaskRunnable task = new TaskRunnable();
ExecutorService excutor = Executors.newFixedThreadPool(threadSize);
for (int i = 0; i < threadSize; i++) {
excutor.submit(task);
}
excutor.shutdown();
while (!excutor.isTerminated()) {
}
如果需要知道线程池中的任务是否运行结束如下操作:
用Future<Boolean> f=pool.submit(t);,然后任务用implements Callable<Boolean>,等所有县城的f.get();返回的是true的时候就是所有线程执行完毕。这样的话就不需要shutdown线程池。线程池也可以使用全局变量的形式。这样就避免了线程池序列号递增的问题。保证使用一个线程池。。。 |