zoukankan      html  css  js  c++  java
  • Java

    概要

    前面分别介绍了"Java多线程基础"、"JUC原子类"和"JUC锁"。本章介绍JUC的最后一部分的内容——线程池。内容包括:
    线程池架构图
    线程池示例

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html

    线程池架构图

    线程池的架构图如下:

    1. Executor

    它是"执行者"接口,它是来执行任务的。准确的说,Executor提供了execute()接口来执行已提交的 Runnable 任务的对象。Executor存在的目的是提供一种将"任务提交"与"任务如何运行"分离开来的机制。
    它只包含一个函数接口:

    void execute(Runnable command)

    2. ExecutorService

    ExecutorService继承于Executor。它是"执行者服务"接口,它是为"执行者接口Executor"服务而存在的;准确的话,ExecutorService提供了"将任务提交给执行者的接口(submit方法)","让执行者执行任务(invokeAll, invokeAny方法)"的接口等等。

    ExecutorService的函数列表

     View Code

    3. AbstractExecutorService

    AbstractExecutorService是一个抽象类,它实现了ExecutorService接口。
    AbstractExecutorService存在的目的是为ExecutorService中的函数接口提供了默认实现。

    AbstractExecutorService函数列表
    由于它的函数列表和ExecutorService一样,这里就不再重复列举了。

    4. ThreadPoolExecutor

    ThreadPoolExecutor就是大名鼎鼎的"线程池"。它继承于AbstractExecutorService抽象类。

    ThreadPoolExecutor函数列表

     View Code

    5. ScheduledExecutorService

    ScheduledExecutorService是一个接口,它继承于于ExecutorService。它相当于提供了"延时"和"周期执行"功能的ExecutorService。
    ScheduledExecutorService提供了相应的函数接口,可以安排任务在给定的延迟后执行,也可以让任务周期的执行。

    ScheduledExecutorService函数列表

     View Code

    6. ScheduledThreadPoolExecutor

    ScheduledThreadPoolExecutor继承于ThreadPoolExecutor,并且实现了ScheduledExecutorService接口。它相当于提供了"延时"和"周期执行"功能的ScheduledExecutorService。
    ScheduledThreadPoolExecutor类似于Timer,但是在高并发程序中,ScheduledThreadPoolExecutor的性能要优于Timer。

    ScheduledThreadPoolExecutor函数列表

     View Code

    7. Executors

    Executors是个静态工厂类。它通过静态工厂方法返回ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 等类的对象。

    Executors函数列表

     View Code

    线程池示例

    下面通过示例来对线程池的使用做简单演示。

    复制代码
     1 import java.util.concurrent.Executors;
     2 import java.util.concurrent.ExecutorService;
     3 
     4 public class ThreadPoolDemo1 {
     5 
     6     public static void main(String[] args) {
     7         // 创建一个可重用固定线程数的线程池
     8         ExecutorService pool = Executors.newFixedThreadPool(2);
     9         // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    10         Thread ta = new MyThread();
    11         Thread tb = new MyThread();
    12         Thread tc = new MyThread();
    13         Thread td = new MyThread();
    14         Thread te = new MyThread();
    15         // 将线程放入池中进行执行
    16         pool.execute(ta);
    17         pool.execute(tb);
    18         pool.execute(tc);
    19         pool.execute(td);
    20         pool.execute(te);
    21         // 关闭线程池
    22         pool.shutdown();
    23     }
    24 }
    25 
    26 class MyThread extends Thread {
    27 
    28     @Override
    29     public void run() {
    30         System.out.println(Thread.currentThread().getName()+ " is running.");
    31     }
    32 }
    复制代码

    运行结果

    pool-1-thread-1 is running.
    pool-1-thread-2 is running.
    pool-1-thread-1 is running.
    pool-1-thread-2 is running.
    pool-1-thread-1 is running.

    结果说明
    主线程中创建了线程池pool,线程池的容量是2。即,线程池中最多能同时运行2个线程。
    紧接着,将ta,tb,tc,td,te这3个线程添加到线程池中运行。
    最后,通过shutdown()关闭线程池。

  • 相关阅读:
    mac 终端常见指令
    git常见指令
    iOS8的autolayout和size class
    UIWindow详解
    操作系统Unix、Windows、Mac OS、Linux的故事
    iOS引用当前显示的UIAlertView
    Unexpected CFBundleExecutable Key
    《CODE》讲了什么?
    exit和return的区别
    php 登录注册api接口代码
  • 原文地址:https://www.cnblogs.com/qlky/p/7390274.html
Copyright © 2011-2022 走看看