Java线程池的用法、线程池的工厂类Executors,接口类ExecutorService

Java里面线程池的顶级接口是java.util.concurrent.Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是java.util.concurrent.ExecutorService

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在java.util.concurrent.Executors线程工厂类里面提供了一些静态工厂,生成一些常用的线程池。官方建议使用Executors工程类来创建线程池对象。

Executors类中的静态方法:

static ExecutorService newFixedThreadPool(int nThreads) 创建一个可重用固定线程数的线程池

  • 参数:
    int nThreads:创建线程池中包含的线程数量
  • 返回值:
    ExecutorService接口,返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程),返回接口的意思是,返回值用接口接收,但是实际写的返回值是那个接口的实现类对象,通过这样,能让写这个方法的人能够返回那个接口的不同实现类。

java.util.concurrent.ExecutorService:线程池接口

用来从线程池中获取线程,调用start方法,执行线程任务

  • submit(Runnable task)提交一个 Runnable任务用于执行

关闭/销毁线程池的方法

  • void shutdown()

线程池的使用步骤:

  1. 使用线程池的工厂类Executors里边提供的静态方法newFixedThreadPool()生产一个指定线程数量的线程池
  2. 创建一个类,实现Runnable接口,重写run方法,设置线程任务
  3. 调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
  4. 调用ExecutorService中的方法shutdown销毁线程池(不建议执行)

下图是自己实现一个线程池,用集合的方法,在ArrayList(HashSet, LinkedList, HashMap)中放入一定数量的线程即可
Java线程池的用法、线程池的工厂类Executors,接口类ExecutorService_第1张图片

//2. 创建一个类,实现`Runnable接口`,重写run方法,设置线程任务
public class RunnableImpl implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程执行");
    }
}
public class DemoThreadPool {
    public static void main(String[] args) {
        //1. 使用线程池的工厂类`Executors`里边提供的静态方法,返回接口的实现类,但是用接口接收
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        //3. 调用`ExecutorService`中的方法`submit`,传递线程任务(实现类),开启线程,执行`run方法`
        executorService.submit(new RunnableImpl());
        executorService.submit(new RunnableImpl());
        executorService.submit(new RunnableImpl());

        //不推荐关闭线程池,这样线程池没意义了,如果不关闭,整个Java进程会一直执行不停下
        executorService.shutdown();
    }
}

你可能感兴趣的:(Java多线程基础)