两种方法判断线程池停止?

一、 ExecutorService 自身方法
  1. void shutdown;会拒绝继续提交任务到队列,但会把正在执行的任务和队列中的任务执行完。
  2. boolean isShutdown;判断是否开始了关闭工作,为ture不代表线程池已经关闭,只代表可以执行关闭任务了。
  3. boolean isTerminated;代表线程已经真正终结了。
  4. boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; 等待一点时间,如果线程池终结返回true,没有终结返回false,如果线程被打断抛异常。
  5. List shutdownNow;立刻发送中断信号,终止所有线程,并返回一个停止线程的队列,要求线程能够正确响应中断。
  6. 使用 threadPoll.shutdown()和 threadPoll.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);配合
package com.example.thread.threadlocal.scene1;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 加 ThreadLocal 解决
 * 关闭线程池方法 {@link ExecutorService awaitTermination}
 * @author xuyy
 */
public class ThreadLocalDemo08 {

    public static ExecutorService threadPoll = new ThreadPoolExecutor(16, 16,
            0L, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<>(1000));

    public SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");


    public static void main(String[] args) throws InterruptedException {
        long st = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            threadPoll.execute(() -> {
                String date = date(finalI);
                System.out.println(date);
            });
        }
        threadPoll.shutdown();
        threadPoll.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        if (threadPoll.isTerminated()) {
            long et = System.currentTimeMillis();
            System.out.println("耗时:" + (et - st) + "秒");
        }
    }


    public static String date(int seconds) {
        Date date = new Date(1000 * seconds);
        SimpleDateFormat simpleDateFormat = ThreadSafeFormat.dataFormatterThreadLocal.get();
        System.out.println(System.identityHashCode(simpleDateFormat));
        return simpleDateFormat.format(date);
    }

    static class ThreadSafeFormatter06 {
        public static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
            @Override
            protected SimpleDateFormat initialValue() {
                return new ThreadLocalDemo08().simpleDateFormat;
            }

        };
    }
}



二、CountDownLatch类
  1. 使用CountDownLatch
package com.example.thread.threadlocal.scene1;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 加 ThreadLocal 解决
 * <p>
 * {@link ThreadLocal} 用作保存每个线程独享的对象,为每个线程都创建一个副本,每个线程都只能修改自己所拥有的副本,
 * 而不会影响其他线程的副本,这样就让原本在并发情况下,线程不安全的情况变成了线程安全的情况。
 * * 关闭线程池方法 {@link CountDownLatch await}
 *
 * @author xuyy
 */
public class ThreadLocalDemo06 {

    public static ExecutorService threadPoll = new ThreadPoolExecutor(16, 16,
            0L, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<>(1000));

    public SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");


    public static void main(String[] args) throws InterruptedException {
        long st = System.currentTimeMillis();
        CountDownLatch countDownLatch = new CountDownLatch(1000);
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            threadPoll.execute(() -> {
                String date = date(finalI);
                System.out.println(date);
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        long et = System.currentTimeMillis();
        System.out.println("耗时:"+(et-st)+"秒");
    }


    public static String date(int seconds) {
        Date date = new Date(1000 * seconds);
        SimpleDateFormat simpleDateFormat = ThreadSafeFormat.dataFormatterThreadLocal.get();
        System.out.println(System.identityHashCode(simpleDateFormat));
        return simpleDateFormat.format(date);
    }

    static class ThreadSafeFormatter06 {
        public static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
            @Override
            protected SimpleDateFormat initialValue() {
                return new ThreadLocalDemo06().simpleDateFormat;
            }

        };
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值