实验探究-ExecutorServiceAPI----未完待续!!!!具体细节问题之后补充

1 isShutDown & isTerminated & executorRunnableError & executorRunnableTask

isShutDown:当调用shutdown()或shutdownNow()方法后返回为true。
isTerminated:当调用shutdown()方法后,并且所有提交的任务完成后返回为true;
isTerminated:当调用shutdownNow()方法后,成功停止后返回为true;
如果线程池任务正常完成,都为false

public class ExecutorServiceTest {
    public static void main(String[] args) throws InterruptedException {
//        isShutdown();
//        isTerminated_1();
//        executorRunnableError();
        executorRunnableTask();
    }
}

1 isShutdown

private static void isShutdown() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        /**
         * void execute(Runnable command);
         */
        executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        /**
         * 如果此执行器已关闭,则返回true。
         */
        System.out.println(executorService.isShutdown());
        executorService.shutdown();
        System.out.println(executorService.isShutdown());
        /**
         * 执行完 executorService.shutdown(); 之后 还可以执行一个Runnable?不会,抛出异常!!!
         */
        executorService.execute(() -> System.out.println("i will executor after shutdown ..."));
        /**
         * false
         * true
         * Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.thread.excutor.ExecutorServiceTest$$Lambda$2/932583850@cac736f rejected from java.util.concurrent.ThreadPoolExecutor@5e265ba4[Shutting down, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
         * 	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
         * 	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
         * 	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
         * 	at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:668)
         * 	at com.thread.excutor.ExecutorServiceTest.isShutdown(ExecutorServiceTest.java:32)
         * 	at com.thread.excutor.ExecutorServiceTest.main(ExecutorServiceTest.java:9)
         */
    }

2 isTerminated

private static void isTerminated_1() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(1);
        executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        executorService.shutdown();
        System.out.println("executorService.isShutdown() " + executorService.isShutdown());
        /**
         * 1、当需要用到isTerminated()函数判断线程池中的所有线程是否执行完毕时候,不能直接使用该函数,
         *    必须在shutdown()方法关闭线程池之后才能使用,否则isTerminated()永不为TRUE,线程将一直阻塞在该判断的地方,导致程序最终崩溃。
         * 2、判断全部提交的任务是否完成,当调用shutdown()方法后,并且所有提交的任务完成后返回为true
         */
        System.out.println("1-executorService.isTerminated() " + executorService.isTerminated());
        System.out.println("executorService.isTerminating() " + executorService.isTerminating());

        /**
         * executorService.isShutdown() true
         * executorService.isTerminated() false
         * executorService.isTerminating() true
         */

    }

3 executorRunnableError - IntStream.range(0, 10).boxed().forEach(i -> executorService.execute(() -> System.out.println(1 / 0)));

private static void executorRunnableError() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(10, new MyThreadFactory());
        IntStream.range(0, 10).boxed().forEach(i -> executorService.execute(() -> System.out.println(1 / 0)));
        executorService.shutdown();
        try {
            executorService.awaitTermination(10, TimeUnit.MINUTES);
            System.out.println("============over============");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private static class MyThreadFactory implements ThreadFactory {
        private final static AtomicInteger SEQ = new AtomicInteger();
        @Override
        public Thread newThread(@NotNull Runnable r) {
            Thread thread = new Thread(r);
            thread.setName("My-Thread-" + SEQ.getAndIncrement());
            /**
             *  void uncaughtException(Thread t, Throwable e);
             */
            thread.setUncaughtExceptionHandler((t, e) -> {
                System.out.println("The thread " + t.getName() + " executor failed.");
                System.out.println("=====================");
            });
            return thread;
        }
    }
/**
The thread My-Thread-6 executor failed.
The thread My-Thread-1 executor failed.
=====================
The thread My-Thread-14 executor failed.
=====================
The thread My-Thread-5 executor failed.
=====================
The thread My-Thread-4 executor failed.
=====================
The thread My-Thread-2 executor failed.
=====================
The thread My-Thread-0 executor failed.
=====================
The thread My-Thread-3 executor failed.
=====================
=====================
The thread My-Thread-7 executor failed.
=====================
The thread My-Thread-12 executor failed.
=====================
============over============

Process finished with exit code 0
*/

4 executorRunnableTask-自定义task任务

/**
     *                             | ---->
     * send  ---> store db ---> 10 | ---->
     *                             | ---->
     */
    private static void executorRunnableTask() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10, new MyThreadFactory());
        IntStream.range(0, 10).boxed().forEach(i -> executorService.execute(() ->
        {
            MyTask myTask = new MyTask(i) {
                @Override
                public void error(Throwable e) {
                    System.out.println("The no : " + i + " failed, update status to ERROR.");
                }

                @Override
                public void done() {
                    System.out.println("The no : " + i + " successfully, update status to DONE.");
                }

                @Override
                public void doExecutor() {
                    if (i % 3 == 0) {
                        int time = 1 / 0;
                    }
                }

                @Override
                public void doInit() {
                    // do noting ...
                }
            };
            myTask.run();
        }));

        executorService.shutdown();
        executorService.awaitTermination(10, TimeUnit.MINUTES);
        System.out.println("=======================");
        /**
         * The no : 0 failed, update status to ERROR.
         * The no : 3 failed, update status to ERROR.
         * The no : 2 successfully, update status to DONE.
         * The no : 1 successfully, update status to DONE.
         * The no : 4 successfully, update status to DONE.
         * The no : 5 successfully, update status to DONE.
         * The no : 7 successfully, update status to DONE.
         * The no : 6 failed, update status to ERROR.
         * The no : 8 successfully, update status to DONE.
         * The no : 9 failed, update status to ERROR.
         * =======================
         */
    }
    private abstract static class MyTask implements Runnable {
        public final Integer no;
        public MyTask(Integer no) {
            this.no = no;
        }
        @Override
        public void run() {
            try {
                this.doInit();
                this.doExecutor();
                this.done();
            } catch (Throwable e) {
                this.error(e);
            }
        }
        public abstract void error(Throwable e);
        public abstract void done();
        public abstract void doExecutor();
        public abstract void doInit();
    }

2 任务拒绝 testAbortPolicy & testDiscardPolicy & testDiscardOldestPolicy & testCallerRunsPolicy

任务拒绝模块是线程池的保护部分,线程池有一个最大的容量,当线程池的任务缓存队列已满,并且线程池中的线程数目达到maximumPoolSize时,就需要拒绝掉该任务,采取任务拒绝策略,保护线程池。

package com.thread.excutor;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class RejectedExecutionHandlerTest {
    public static void main(String[] args) {
//        testAbortPolicy();
//        testDiscardPolicy();
        testDiscardOldestPolicy();
//        testCallerRunsPolicy();
    }

    /**
     * 由提交任务的线程处理该任务
     */
    private static void testCallerRunsPolicy() {
        ExecutorService executorService = new ThreadPoolExecutor(1,
                2,
                30,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                Thread::new,
                new ThreadPoolExecutor.CallerRunsPolicy());
        IntStream.range(0, 3).boxed().forEach(item -> {
            executorService.execute(() -> {
                try {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("yyyy " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        });
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.execute(() -> {
            System.out.println("xxxx == " +  Thread.currentThread().getName());
        });
        /**
         * xxxx == main
         * yyyy Thread-1
         * yyyy Thread-0
         * yyyy Thread-1
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */
    }

    /**
     * 1、丢弃队列最前面的任务,然后重新提交被拒绝的任务。
     * 2、当任务被拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去。
     *    在rejectedExecution先从任务队列种弹出最先加入的任务,空出一个位置,然后再次执行execute方法把任务加入队列。
     */
    private static void testDiscardOldestPolicy() {
        ExecutorService executorService = new ThreadPoolExecutor(1,
                2,
                30,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                Thread::new,
                new ThreadPoolExecutor.DiscardOldestPolicy());
        IntStream.range(0, 3).boxed().forEach(item -> {
            executorService.execute(() -> {
                try {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("yyyy " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        });
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.execute(() -> System.out.println("xxxx" + Thread.currentThread().getName()));
        /**
         * yyyy Thread-0
         * yyyy Thread-1
         * xxxxThread-0
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */
    }

    /**
     * 不处理新任务,直接丢弃掉
     */
    private static void testDiscardPolicy() {
        ExecutorService executorService = new ThreadPoolExecutor(1,
                2,
                30,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                Thread::new,
                new ThreadPoolExecutor.DiscardPolicy());
        IntStream.range(0, 3).boxed().forEach(item -> {
            executorService.execute(() -> {
                try {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("yyyy");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        });
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.execute(() -> System.out.println("xxxx"));
        /**
         * yyyy
         * yyyy
         * yyyy
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */
    }

    /**
     * Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.thread.excutor.RejectedExecutionHandlerTest$$Lambda$5/604107971@7637f22 rejected from java.util.concurrent.ThreadPoolExecutor@4926097b[Running, pool size = 2, active threads = 2, queued tasks = 1, completed tasks = 0]
     * 	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
     * 	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
     * 	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
     * 	at com.thread.excutor.RejectedExecutionHandlerTest.testAbortPolicy(RejectedExecutionHandlerTest.java:36)
     * 	at com.thread.excutor.RejectedExecutionHandlerTest.main(RejectedExecutionHandlerTest.java:11)
     * yyyy
     * yyyy
     * yyyy
     *
     * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
     */
    private static void testAbortPolicy() {
        ExecutorService executorService = new ThreadPoolExecutor(1,
                2,
                30,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                Thread::new,
                /**
                 * AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。
                 * 丢弃任务,并抛出异常:最大承载=maximumPoolSize + BlockingQueue
                 */
                new ThreadPoolExecutor.AbortPolicy());
        IntStream.range(0, 3).boxed().forEach(item -> {
            executorService.execute(() -> {
                try {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("yyyy");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        });
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.execute(() -> System.out.println("xxxx"));

    }
}

3 AllowCoreThreadTimeOut

allowCoreThreadTimeOut 支持回收核心线程,合适定时任务这种回收。

package com.thread.excutor;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class TestAllowCoreThreadTimeOut {
    public static void main(String[] args) {
//        getActiveCount();
//        testAllowCoreThreadTimeOut_1();
//        testAllowCoreThreadTimeOut_2();
//        testAllowCoreThreadTimeOut_3();
        testAllowCoreThreadTimeOut_4();
    }

    private static void getActiveCount() {
        /**
         *     public static ExecutorService newFixedThreadPool(int nThreads) {
         *         return new ThreadPoolExecutor(nThreads, nThreads,
         *                                       0L, TimeUnit.MILLISECONDS,
         *                                       new LinkedBlockingQueue<Runnable>());
         *     }
         */
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        System.out.println("1 - " + executorService.getActiveCount());
        executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("2 - " + executorService.getActiveCount());
        /**
         * 1 - 0
         * 2 - 1
         */
    }

    private static void testAllowCoreThreadTimeOut_1() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        System.out.println("1===" + executorService.getActiveCount());
        IntStream.range(0, 5).boxed().forEach(item -> executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }));
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("2===" + executorService.getActiveCount());
        /**
         * 不会销毁
         * 1===0
         * 2===0
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */
    }

    private static void testAllowCoreThreadTimeOut_2() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        executorService.allowCoreThreadTimeOut(true);
        System.out.println("1===" + executorService.getActiveCount());
        IntStream.range(0, 5).boxed().forEach(item -> executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }));
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("2===" + executorService.getActiveCount());
        /**
         * Exception in thread "main" java.lang.IllegalArgumentException: Core threads must have nonzero keep alive times
         * 	at java.util.concurrent.ThreadPoolExecutor.allowCoreThreadTimeOut(ThreadPoolExecutor.java:1658)
         * 	at com.thread.excutor.TestU.testAllowCoreThreadTimeOut_2(TestU.java:70)
         * 	at com.thread.excutor.TestU.main(TestU.java:12)
         */
    }

    private static void testAllowCoreThreadTimeOut_3() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        executorService.setKeepAliveTime(10, TimeUnit.SECONDS);
        executorService.allowCoreThreadTimeOut(true);
        System.out.println("1===" + executorService.getActiveCount());
        IntStream.range(0, 5).boxed().forEach(item -> executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }));
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("2===" + executorService.getActiveCount());
        /**
         * 程序会自动退出
         * 1===0
         * 2===0
         *
         * Process finished with exit code 0
         */
    }

    private static void testAllowCoreThreadTimeOut_4() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        executorService.setKeepAliveTime(10, TimeUnit.SECONDS);
        executorService.allowCoreThreadTimeOut(true);
        System.out.println("1===" + executorService.getActiveCount());
        IntStream.range(0, 5).boxed().forEach(item -> executorService.execute(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }));
        System.out.println("2===" + executorService.getActiveCount());
        executorService.execute(() -> {
            try {
                System.out.println("xxxxxx");
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("3===" + executorService.getActiveCount());
        /**
         * 1===0
         * 2===5
         * xxxxxx
         * 3===1
         *
         * Process finished with exit code 0
         */
    }
}

4 InvokeAny & InvokeAll & submit

public class TestInvokeAllAnySubmit {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
//        testInvokeAny();
//        testInvokeAnyTimeOut();
//        testInvokeAll_1();
//        testInvokeAll_2();
//        testInvokeAllTimeOut();
//        testSubmitRunnable();
        testSubmitRunnable_2();
    }
}

1 testInvokeAny

	/**
     * 当一个结果返回的时候,其他的线程会接着执行吗?
     * 1、invokeAny取得第一个方法的返回值,当第一个任务结束后,会调用interrupt方法中断其它任务。
     * 2、invokeAll具有阻塞性。
     */
    private static void testInvokeAny() throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<Callable<Integer>> callableList = IntStream.range(0, 5).boxed().map(item ->
                (Callable<Integer>) () -> {
                    TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(1));
                    System.out.println(Thread.currentThread().getName() + " : " + item);
                    return item;
                }).collect(Collectors.toList());
        /**
         *     <T> T invokeAny(Collection<? extends Callable<T>> tasks,
         *                     long timeout, TimeUnit unit)
         *         throws InterruptedException, ExecutionException, TimeoutException;
         */
        Integer vale = executorService.invokeAny(callableList);
        System.out.println("===========finished============");
        System.out.println(vale);
        /**
         * pool-1-thread-2 : 1
         * pool-1-thread-1 : 0
         * pool-1-thread-5 : 4
         * pool-1-thread-4 : 3
         * pool-1-thread-3 : 2
         * ===========finished============
         * 1
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */
    }
private static void testInvokeAnyTimeOut() throws ExecutionException, InterruptedException, TimeoutException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<Callable<Integer>> callableList = IntStream.range(0, 5).boxed().map(item ->
                (Callable<Integer>) () -> {
                    TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(20));
                    System.out.println(Thread.currentThread().getName() + " : " + item);
                    return item;
                }).collect(Collectors.toList());
        /**
         *     <T> T invokeAny(Collection<? extends Callable<T>> tasks,
         *                     long timeout, TimeUnit unit)
         *         throws InterruptedException, ExecutionException, TimeoutException;
         */
        Integer vale = executorService.invokeAny(callableList, 3, TimeUnit.SECONDS);
        System.out.println("===========finished============");
        System.out.println(vale);

        /**
         * 情况1、
         * pool-1-thread-4 : 3
         * ===========finished============
         * 3
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */

        /**
         * 情况2、
         * 在指定时间内取得第一个先执行完任务的结果值,如果超时,抛出TimeoutException,并且interrupt线程。
         *
         * Exception in thread "main" java.util.concurrent.TimeoutException
         * 	at java.util.concurrent.AbstractExecutorService.doInvokeAny(AbstractExecutorService.java:184)
         * 	at java.util.concurrent.AbstractExecutorService.invokeAny(AbstractExecutorService.java:225)
         * 	at com.thread.excutor.TestInvokeAllAnySubmit.testInvokeAnyTimeOut(TestInvokeAllAnySubmit.java:28)
         * 	at com.thread.excutor.TestInvokeAllAnySubmit.main(TestInvokeAllAnySubmit.java:17)
         */
    }

2 testInvokeAll

private static void testInvokeAll_1() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<Callable<Integer>> callableList = IntStream.range(0, 5).boxed().map(item ->
                (Callable<Integer>) () -> {
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println(Thread.currentThread().getName() + " : " + item);
                    return item;
                }).collect(Collectors.toList());
        /**
         *     <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
         *         throws InterruptedException;
         */
        List<Future<Integer>> futures = executorService.invokeAll(callableList);
        futures.stream().map(item -> {
            try {
                return item.get();
            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }
        }).forEach(System.out::println);
        System.out.println("==========finished============");
        /**
         * pool-1-thread-5 : 4
         * pool-1-thread-2 : 1
         * pool-1-thread-1 : 0
         * pool-1-thread-4 : 3
         * pool-1-thread-3 : 2
         * 0
         * 1
         * 2
         * 3
         * 4
         * ==========finished============
         */

    }
private static void testInvokeAll_2() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<Callable<Integer>> callableList = IntStream.range(0, 5).boxed().map(item ->
                (Callable<Integer>) () -> {
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println(Thread.currentThread().getName() + " : " + item);
                    return item;
                }).collect(Collectors.toList());
        List<Future<Integer>> futures = executorService.invokeAll(callableList);
        futures.parallelStream().map(item -> {
            try {
                return item.get();
            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }
        }).forEach(System.out::println);
        System.out.println("==========finished============");
        /**
         * pool-1-thread-2 : 1
         * pool-1-thread-4 : 3
         * pool-1-thread-1 : 0
         * pool-1-thread-5 : 4
         * pool-1-thread-3 : 2
         * 2
         * 0
         * 3
         * 4
         * 1
         * ==========finished============
         */

    }
private static void testInvokeAllTimeOut() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<Callable<Integer>> callableList = IntStream.range(0, 5).boxed().map(item ->
                (Callable<Integer>) () -> {
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println(Thread.currentThread().getName() + " : " + item);
                    return item;
                }).collect(Collectors.toList());
        List<Future<Integer>> futures = executorService.invokeAll(callableList, 1, TimeUnit.SECONDS);
        futures.parallelStream().map(item -> {
            try {
                return item.get();
            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }
        }).forEach(System.out::println);
        System.out.println("==========finished============");
        /**
         * Exception in thread "main" java.util.concurrent.CancellationException
         * 	at java.util.concurrent.FutureTask.report(FutureTask.java:121)
         * 	at java.util.concurrent.FutureTask.get(FutureTask.java:192)
         * 	at com.thread.excutor.TestInvokeAllAnySubmit.lambda$testInvokeAllTimeOut$2(TestInvokeAllAnySubmit.java:35)
         * 	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
         * 	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
         * 	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
         * 	at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291)
         * 	at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
         * 	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
         * 	at java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:401)
         * 	at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:734)
         * 	at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160)
         * 	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174)
         * 	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
         * 	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
         * 	at com.thread.excutor.TestInvokeAllAnySubmit.testInvokeAllTimeOut(TestInvokeAllAnySubmit.java:39)
         * 	at com.thread.excutor.TestInvokeAllAnySubmit.main(TestInvokeAllAnySubmit.java:21)
         */

    }

3 testSubmitRunnable

/**
     * <T> Future<T> submit(Runnable task, T result);
     * Future<?> submit(Runnable task);
     * <T> Future<T> submit(Callable<T> task);
     *
     * 在使用线程池的时候,发现除了execute()方法可以执行任务外,还发现有一个方法submit()可以执行任务。
     * submit()的参数既可以是Runnable,又可以是Callable。
     * 适用于需要获取返回值的场景。
     * 调用future get方法时,异常会抛出。如果不调用get方法,则无法获取。
     */
    private static void testSubmitRunnable_2() throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        String result = "done";
        Future<String> future = executorService.submit(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, result);
        String s = future.get();
        System.out.println(s);
        /**
         * done
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */
    }

    private static void testSubmitRunnable() throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        Future<?> future = executorService.submit(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        Object o = future.get();
        System.out.println("result = " + o);
        /**
         * result = null
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         * 程序未执行结束。。。
         */
    }

5 小实验-getQueue().add()

package com.thread.excutor;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class TestU {
    public static void main(String[] args) {
//        getQueueAdd_1();
//        getQueueAdd_2();
    }
    

    private static void getQueueAdd_2() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        executorService.execute(() -> System.out.println("I will be process because of triggered the executor."));
        executorService.getQueue().add(() -> System.out.println("I am added directly into the queue"));
        /**
         * I will be process because of triggered the executor.
         * I am added directly into the queue
         *
         * Process finished with exit code 130 (interrupted by signal 2: SIGINT)
         */

    }

    private static void getQueueAdd_1() {
        ThreadPoolExecutor executorService = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
        executorService.getQueue().add(() -> System.out.println("I am added directly into the queue"));
        /**
         * 未执行 。。。
         * Process finished with exit code 0
         */
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值