可能是最全的java线程指南(1-2)[任务调度类_Executor系]

Posted by Zeusro on May 9, 2019
👈🏻 Select language
1
2
3
4
5
6
7
graph TB
e(Executor<V>)-->es(ExecutorService)
es-->se(ScheduledExecutorService)
es-->aes(AbstractExecutorService)
aes-->tpe(ThreadPoolExecutor)
tpe-->ste(ScheduledThreadPoolExecutor)
se-->ste

image

ExecutorService

一个运行新任务的简单接口。

ExecutorService,扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。

可以通过java.util.concurrent.Executors类,提供了多个实例化线程的简易静态工厂方法,来创造ExecutorService的子类(一般是创建ThreadPoolExecutor/ScheduledExecutorService/ScheduledThreadPoolExecutor)

ScheduledExecutorService

继承了ExecutorService和Executor。支持Future和定期执行任务。

AbstractExecutorService

ThreadPoolExecutor

实现了ExecutorService,所以才能够这么玩

1
2
3
4
5
6
7
        //guava
        ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("ExecutorServiceExample-%d").build();
        ExecutorService executor = new ThreadPoolExecutor(1,
                200,
                0L,
                TimeUnit.DAYS,
                new LinkedBlockingDeque<Runnable>(1024),factory);

ScheduledThreadPoolExecutor

从上图的继承树就可以看出,ScheduledThreadPoolExecutor通过继承ScheduledExecutorService接口实现了其特性,多出了一个awaitTermination方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        Runnable runnabledelayedTask = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " is Running Delayed Task");
            }
        };


        Callable callabledelayedTask = new Callable() {

            @Override
            public String call() throws Exception {
                return "GoodBye! See you at another invocation...";
            }
        };
        ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(4);
        scheduledPool.scheduleWithFixedDelay(runnabledelayedTask, 1, 1, TimeUnit.SECONDS);
        ScheduledFuture sf = scheduledPool.schedule(callabledelayedTask, 4, TimeUnit.SECONDS);
        String value = (String) sf.get();
        System.out.println("Callable returned" + value);
        scheduledPool.shutdown();
        System.out.println("Is ScheduledThreadPool shutting down? " + scheduledPool.isShutdown());
1
2
3
4
5
6
7
graph TB
e(Executor<V>)-->es(ExecutorService)
es-->se(ScheduledExecutorService)
es-->aes(AbstractExecutorService)
aes-->tpe(ThreadPoolExecutor)
tpe-->ste(ScheduledThreadPoolExecutor)
se-->ste

image

ExecutorService

A simple interface for running new tasks.

ExecutorService extends the Executor interface. Adds some methods for managing executor lifecycle and task lifecycle.

You can use the java.util.concurrent.Executors class, which provides multiple simple static factory methods for instantiating threads, to create subclasses of ExecutorService (generally creating ThreadPoolExecutor/ScheduledExecutorService/ScheduledThreadPoolExecutor).

ScheduledExecutorService

Inherits ExecutorService and Executor. Supports Future and periodic task execution.

AbstractExecutorService

ThreadPoolExecutor

Implements ExecutorService, so it can be used this way.

1
2
3
4
5
6
7
        //guava
        ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("ExecutorServiceExample-%d").build();
        ExecutorService executor = new ThreadPoolExecutor(1,
                200,
                0L,
                TimeUnit.DAYS,
                new LinkedBlockingDeque<Runnable>(1024),factory);

ScheduledThreadPoolExecutor

From the inheritance tree in the diagram above, we can see that ScheduledThreadPoolExecutor implements its features by inheriting the ScheduledExecutorService interface, adding an awaitTermination method.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        Runnable runnabledelayedTask = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " is Running Delayed Task");
            }
        };


        Callable callabledelayedTask = new Callable() {

            @Override
            public String call() throws Exception {
                return "GoodBye! See you at another invocation...";
            }
        };
        ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(4);
        scheduledPool.scheduleWithFixedDelay(runnabledelayedTask, 1, 1, TimeUnit.SECONDS);
        ScheduledFuture sf = scheduledPool.schedule(callabledelayedTask, 4, TimeUnit.SECONDS);
        String value = (String) sf.get();
        System.out.println("Callable returned" + value);
        scheduledPool.shutdown();
        System.out.println("Is ScheduledThreadPool shutting down? " + scheduledPool.isShutdown());
1
2
3
4
5
6
7
graph TB
e(Executor<V>)-->es(ExecutorService)
es-->se(ScheduledExecutorService)
es-->aes(AbstractExecutorService)
aes-->tpe(ThreadPoolExecutor)
tpe-->ste(ScheduledThreadPoolExecutor)
se-->ste

image

ExecutorService

Простой интерфейс для запуска новых задач.

ExecutorService расширяет интерфейс Executor. Добавляет некоторые методы для управления жизненным циклом исполнителя и жизненным циклом задач.

Вы можете использовать класс java.util.concurrent.Executors, который предоставляет несколько простых статических фабричных методов для создания экземпляров потоков, для создания подклассов ExecutorService (обычно создание ThreadPoolExecutor/ScheduledExecutorService/ScheduledThreadPoolExecutor).

ScheduledExecutorService

Наследует ExecutorService и Executor. Поддерживает Future и периодическое выполнение задач.

AbstractExecutorService

ThreadPoolExecutor

Реализует ExecutorService, поэтому может использоваться таким образом.

1
2
3
4
5
6
7
        //guava
        ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("ExecutorServiceExample-%d").build();
        ExecutorService executor = new ThreadPoolExecutor(1,
                200,
                0L,
                TimeUnit.DAYS,
                new LinkedBlockingDeque<Runnable>(1024),factory);

ScheduledThreadPoolExecutor

Из дерева наследования на диаграмме выше видно, что ScheduledThreadPoolExecutor реализует свои функции, наследуя интерфейс ScheduledExecutorService, добавляя метод awaitTermination.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        Runnable runnabledelayedTask = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " is Running Delayed Task");
            }
        };


        Callable callabledelayedTask = new Callable() {

            @Override
            public String call() throws Exception {
                return "GoodBye! See you at another invocation...";
            }
        };
        ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(4);
        scheduledPool.scheduleWithFixedDelay(runnabledelayedTask, 1, 1, TimeUnit.SECONDS);
        ScheduledFuture sf = scheduledPool.schedule(callabledelayedTask, 4, TimeUnit.SECONDS);
        String value = (String) sf.get();
        System.out.println("Callable returned" + value);
        scheduledPool.shutdown();
        System.out.println("Is ScheduledThreadPool shutting down? " + scheduledPool.isShutdown());