java 线程池之 newSingleThreadExecutor

  • 线程的实现方式

    • java 多线程之 extends Thread

    • java 多线程之 implements Runnable

    • java 多线程之 implements Callable

  • 线程池的使用

    • 线程池简介

    • ThreadPoolExecutor

      • java 线程池之 newScheduledThreadPool

      • java 线程池之 newCachedThreadPool

      • java 线程池之 newFixedThreadPool

      • java 线程池之 newSingleThreadExecutor

    • ForkJoinPool

      • java 线程池之 newWorkStealingPool

 

SingleThreadExecutor线程池其实只是固定某些参数值的 ThreadPoolExecutor,实例化的代码如下:

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue()));
}

java 线程池之 newSingleThreadExecutor_第1张图片

可以清楚的看到:corePoolSize为1,maximumPoolSize为1,keepAliveTime为0,阻塞队列使用的是LinkedBlockingQueue

java 线程池之 newSingleThreadExecutor_第2张图片

而ThreadFactory为默认的defaultThreadFactory,ThreadFactory定义了两个:defaultThreadFactory和privilegedThreadFactory,但是也可以自己定义,实现ThreadFactory接口或者继承已经实现的这两个实现并且修改对应的代码即可。而默认的拒绝策略RejectedExecutionHandler则为 AbortPolicy,并起所有的拒绝策略都是实现接口RejectedExecutionHandler

java 线程池之 newSingleThreadExecutor_第3张图片

除了默认的之外还包含如下:

java 线程池之 newSingleThreadExecutor_第4张图片

SingleThreadExecutor 简单示例如下(其中CountDownLatch 主要是为了等待所有的线程执行完之后再结束):

public class SingleThreadPoolTest {
    private static final int threads = 100;
    private CountDownLatch countDownLatch = new CountDownLatch(threads);

    /**
     * singleThreadPool execute
     *
     * @throws InterruptedException
     */
    @Test
    public void test1() throws InterruptedException {
        System.out.println("---- begin ----");
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < threads; i++) {
            singleThreadExecutor.execute(() -> {
                printThreadInfo();
            });
        }
        countDownLatch.await();
        System.out.println("---- end ----");
    }


    /**
     * singleThreadPool submit
     *
     * @throws InterruptedException
     */
    @Test
    public void test2() throws InterruptedException {
        System.out.println("---- begin ----");
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < threads; i++) {
            singleThreadExecutor.submit(new Thread(() -> {
                printThreadInfo();
            }));
        }
        countDownLatch.await();
        System.out.println("---- end ----");
    }


    /**
     * 打印线程信息
     */
    private void printThreadInfo() {
        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(50);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            countDownLatch.countDown();
        }
    }
}

你可能感兴趣的:(Java)