java 多线程 执行完成 退出 关闭
本来多线程就不熟悉,每次做到这里 总会遇到这个问题,解决一次 忘一次, 这记下来
?
?
? private static int THREAD_NUM = 10; ?线程总数
? private AtomicInteger threadNum = new AtomicInteger(0); ? 每个线程执行完 了 记录一个标记
es.shutdown(); 这个只能让线程池退出,并不能让 主线程推出,所以这里要给一个 ?next ?标记,当线程池 关闭之后,告诉主线程, ?这是主线程 ?继续向下执行;
?
ExecutorService es = Executors.newFixedThreadPool(THREAD_NUM);
? ? for (int i = 0; i < THREAD_NUM; i++) {
? ? ? es.execute(new InitLangFangData(loopStr));
? ? }
? ? boolean next = true;// 主线程退出标记
? ? while (next) {
? ? ? if (THREAD_NUM == threadNum.get()) {
? ? ? ? es.shutdown(); ? //这里是让 ?线程池推出使用的 ,但是主线程并没有退出
? ? ? ? if (es.isShutdown()) {
? ? ? ? ? next = false;
? ? ? ? }
? ? ? } else {
? ? ? ? Thread.sleep(5000);
? ? ? }
? ? }
?
?
class InitLangFangData extends Thread
? {
? ? private String loopStr;
?
? ? public InitLangFangData(String loopStr)
? ? {
?
? ? ? this.loopStr = loopStr;
? ? }
?
? ? public void run()
? ? {
? ? ? try {
? ? ? ? initData(loopStr);
? ? ? } catch (DataCellException e) {
? ? ? ? logger.error(e.getMessage(), e);
? ? ? } catch (IOException e) {
? ? ? ? logger.error(e.getMessage(), e);
? ? ? }
? ? ? threadNum.getAndIncrement();
? ? }
? }