JDK线程池实践

JDK线程池,网上很多代码和示例,自己就实践一下,看看运行结果,加深理解。

public class Test {

    public static int getCoreSize() {
        int core = Runtime.getRuntime().availableProcessors();
        System.out.println("core : " + core);
        return core;
    }

    /**
     * SinglePool。
     * 预期结果:顺序执行
     * @throws InterruptedException 
     */
    public static void singlePool() throws InterruptedException {
        ExecutorService es = Executors.newSingleThreadExecutor();

        Runnable r1 =  SimpleRunnable.getInstance(5);
        Runnable r2 =  SimpleRunnable.getInstance(4);
        Runnable r3 =  SimpleRunnable.getInstance(3);
        Runnable r4 =  SimpleRunnable.getInstance(2);
        Runnable r5 =  SimpleRunnable.getInstance(1);

        es.submit(r1);
        es.submit(r2);
        es.submit(r3);
        es.submit(r4);
        es.submit(r5);

        Thread.sleep(1000l);

        es.shutdown();
    }

    /**
     * 线程不会终止,SinglePool。
     * 预期结果:1个线程运行
     * @throws InterruptedException 
     */
    public static void endlessSinglePool() throws InterruptedException {
        ExecutorService es = Executors.newSingleThreadExecutor();
        Runnable r1 =  EndlessRunnable.getInstance();
        Runnable r2 =  EndlessRunnable.getInstance();
        Runnable r3 =  EndlessRunnable.getInstance();
        Runnable r4 =  EndlessRunnable.getInstance();
        Runnable r5 =  EndlessRunnable.getInstance();

        es.submit(r1);
        es.submit(r2);
        es.submit(r3);
        es.submit(r4);
        es.submit(r5);

        Thread.sleep(1000l);
    }

    /**
     * 线程不会终止,CachedPool。
     * 预期结果:随机执行,所有线程执行
     * @throws InterruptedException 
     */
    public static void endlessCachedPool() throws InterruptedException {
        ExecutorService es = Executors.newCachedThreadPool();

        Runnable r1 =  EndlessRunnable.getInstance();
        Runnable r2 =  EndlessRunnable.getInstance();
        Runnable r3 =  EndlessRunnable.getInstance();
        Runnable r4 =  EndlessRunnable.getInstance();
        Runnable r5 =  EndlessRunnable.getInstance();

        es.submit(r1);
        es.submit(r2);
        es.submit(r3);
        es.submit(r4);
        es.submit(r5);

        Thread.sleep(1000l);

        // 结果:程序并不会终止,无任何信息执行。意味着shutdown无用。
        // 代码分析: interruptIdleWorkers();终止空闲线程。通过thread.interrupt()。
        // es.shutdown();

        // 结果:程序并不会终止,报sleep被中断异常。shutdownNow会试图终止掉阻塞的线程,但因为while循环,并不会杀死线程。
        // 代码分析: interruptWorkers();终止工作线程。通过thread.interrupt()。
        //es.shutdownNow();


    }

    /**
     * 线程不会终止,FixedPool。
     * 预期结果:3个线程运行
     * @throws InterruptedException 
     */
    public static void endlessFixedPool() throws InterruptedException {
        ExecutorService es = Executors.newFixedThreadPool(3);
        Runnable r1 =  EndlessRunnable.getInstance();
        Runnable r2 =  EndlessRunnable.getInstance();
        Runnable r3 =  EndlessRunnable.getInstance();
        Runnable r4 =  EndlessRunnable.getInstance();
        Runnable r5 =  EndlessRunnable.getInstance();

        es.submit(r1);
        es.submit(r2);
        es.submit(r3);
        es.submit(r4);
        es.submit(r5);

        Thread.sleep(1000l);
    }

    /**
     * 前置条件:core:2, max:4, queue:2。EndlessRunanble。
     * 预期结果:加入2个任务,2个线程运行。加入4个线程,2个线程运行。
     *              加入6个线程,4个线程运行,且运行的是1,2,5,6。加入8个线程,报拒绝异常。
     * 关于线程生成策略思考:小于core,每个任务都新建线程:哥有的是线程资源,随便用,不用等;
     *                    大于core小于core+queueSize,排队不生成新线程:虽然任务有点多,但还是可以负担得起。不增加新线程,节约开销;
     *                    大于core+queueSize小于max,创建新线程处理新任务,旧的排队线程依然排队(不讲先来后到):扛不住了,找外援;
     *                    大于max,根据策略处理新加的任务,默认拒绝:我处理不了了,拒绝新任务。
     * @throws InterruptedException 
     */
    public static void threadPool() throws InterruptedException {
        ExecutorService es = new ThreadPoolExecutor(2, 4, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2));

        EndlessRunnableWithState r1 = EndlessRunnableWithState.getInstance(1);
        EndlessRunnableWithState r2 = EndlessRunnableWithState.getInstance(2);
        EndlessRunnableWithState r3 = EndlessRunnableWithState.getInstance(3);
        EndlessRunnableWithState r4 = EndlessRunnableWithState.getInstance(4);
        EndlessRunnableWithState r5 = EndlessRunnableWithState.getInstance(5);
        EndlessRunnableWithState r6 = EndlessRunnableWithState.getInstance(6);
        EndlessRunnableWithState r7 = EndlessRunnableWithState.getInstance(7);
        EndlessRunnableWithState r8 = EndlessRunnableWithState.getInstance(8);


        es.submit(r1);
        es.submit(r2);

        Thread.sleep(3000l);
        System.out.println("sleep 1 over.");

        es.submit(r3);
        es.submit(r4);

        Thread.sleep(3000l);
        System.out.println("sleep 2 over.");

        es.submit(r5);
        es.submit(r6);

        Thread.sleep(3000l);
        System.out.println("sleep 3 over.");
        es.submit(r7);
        es.submit(r8);

    }

    /**
     * 预期结果:4个线程执行同一个任务。
     * 结果分析:每次commit,将任务包装为RunnableFuture对象,然后进行后续操作。不会判断任务是否已存在。同一个任务多个线程执行,得注意线程安全。
     * @throws InterruptedException
     */
    public static void taskRunMultiTime() throws InterruptedException {
        ExecutorService es = Executors.newFixedThreadPool(4);

        EndlessRunnableWithState r1 = EndlessRunnableWithState.getInstance(1);

        es.submit(r1);
        es.submit(r1);
        es.submit(r1);
        es.submit(r1);

        Thread.sleep(3000l);
    }

    public static void main(String[] args) throws InterruptedException {        
        //singlePool();
        //endlessSinglePool();
        //endlessCachedPool();
        //endlessFixedPool();
        //  threadPool();

        taskRunMultiTime();
    }

}
public class SimpleRunnable implements Runnable {

    private int count;

    private SimpleRunnable(int count) {
        this.count = count;
    }

    public static SimpleRunnable getInstance(int count) {
        return new SimpleRunnable(count);
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " running ... with count : " + count);

    }

}
public class EndlessRunnable implements Runnable {

    public static EndlessRunnable getInstance() {
        return new EndlessRunnable();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " running ...");
        while (true) {
            try {
                Thread.sleep(10000l);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}
public class EndlessRunnableWithState implements Runnable {

    private int count;

    private EndlessRunnableWithState(int count) {
        this.count = count;
    }

    public static EndlessRunnableWithState getInstance(int count) {
        return new EndlessRunnableWithState(count);
    }

    @Override
    public void run() {
        System.out.println("thread " + count + " running ...");
        while (true) {
            try {
                Thread.sleep(10000l);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值