*阿炮的Java笔记015号*-简说线程池与Callable

69 阅读2分钟

老生常谈…对于大佬们根本都不用看的博客!

对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点

线程池

简介

实际场景下,我们会经常创建和销毁线程,对性能影响特别大,所以我们想提前创建很多个线程,放在一个容器里,当我们使用的时候,从里面直接获取,这样我们就避免频繁的创建和销毁线程。所以这就是线程池的由来。

优点

  • 提高响应速度(减少创建线程的时间)
  • 减低资源消耗(重复利用线程池中的线程)
  • 便于线程管理

相关API

Executors工具类

// 创建一个线程池
public static ExecutorService newCachedThreadPool()
// 创建指定线程个数的线程池
public static ExecutorService newFixedThreadPool(int nThreads)
// 创建只有1个线程的线程池
public static ExecutorService newSingleThreadExecutor()
// 创建一个可以用于定时、周期任务的并指定线程个数的线程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

ExecutorService接口

// 提交任务,交给线程池中的线程执行
Future<?> submit(Runnable task);
// 提交任务,交给线程池中的线程执行
<T> Future<T> submit(Callable<T> task);
// 关闭线程池
void shutdown();

Callable

简介

Runnable接口是一个无返回值的数据,有时我们需要将数据运行完后进行数据返回,所以诞生了更强大的Callable接口。

优势

  • 具有返回值
  • 可以抛出异常
  • 支持泛型
  • 与FutureTask类进行配合

废话不多说,直接上代码:

public class TestCallable implements Callable {
    @Override
    public String call() throws Exception {
        return "Love Live";
    }
}
public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        Future<String> submit = executorService.submit(new TestCallable());
        String s = submit.get();
        System.out.println(s);
        executorService.shutdown();
    }
}

ThreadPoolExecutor

简介

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  • corePoolSize:核心线程数量(线程池中长期存活的线程数)

  • maximumPoolSize:线程池中的最大线程数量(线程池中最多存放的线程数量)

  • keepAliveTime:存活时间(临时线程多长时间不被使用会被销毁)

  • unit:存活时间单位

  • workQueue:任务队列(任务过多时,不被执行的任务放入该队列里)

  • threadFactory:创建线程工厂(一般采用Executors.defaultThreadFactory()的方法)

  • handler:拒绝策略