Java

一、异步线程启动: new Thread

new Thread(

    new Runnable() {

        @Override

        public void run() {

        // -- 这里是异步线程内的逻辑

 

        }

    }

).start();       

二、Thread 缺点:

  • 每次新建,性能太差
  • 线程缺乏统一管理,可能无限制新建线程,占用资源

线程池优点:

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的可管理性

三、五种线程池

  • newCachedThreadPool 创建可缓存线程池,线程池超过长度,灵活回收
  • newFixedThreadPool 创建定长线程池,可控最大并发数,超出线程在队列中等待
  • newScheduledThreadPool 创建定长线程池,支持定时及周期性执行任务
  • newSingleThreadExecutor 创建一个单线程化的线程池,用唯一工作线程执行任务,顺序执行
  • newWorkStealingPool jdk 1.8】创建多任务队列的线程池,可动态创建和关闭线程。

newWorkStealingPool :适合使用很耗时的操作。是新的线程池类 ForkJoinPool 的扩展。

其他四个线程池都是 ThreadPoolExecutor 的扩展。

四、示例

// 1.7 jdk

newFixedThreadPool 固定大小线程池:

代码示例:

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;
  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

  public void StringToTreeNode(final List<List<Map<String, String>>> dataList, final String userid) {

    fixedThreadPool.execute(new Runnable() {

      @Override

      public void run() {

      // ----- 这里写 线程内任务

      System.out.println(Thread.currentThread().getName());

    }

  });

}

// 1.8 jdk

public static void main(String[] args) {

    ExecutorService pool = Executors.newFixedThreadPool(3);

    pool.execute(() -> System.out.println(Thread.currentThread().getName()) );

    pool.submit(() -> System.out.println(Thread.currentThread().getName()) );

}

execute() 与 submit() 区别:

execute() 来自 public interface Executor { };只有一个方法, 入参为 Runnable,返回值为 void 【没有返回值】

submit() 来自 public interface ExecutorService extends Executor { };有三个方法,入参为 Callable<T>, 可以为 Runnable ,返回值为 Future<T>;可以进行 Exception 处理,通过对Future.get() 进行抛出异常的捕获。

原文地址:https://www.cnblogs.com/wgy1/p/10608839.html