多线程总结

线程池的使用(java1.5之后推荐使用线程池方式创建线程,能更好的管理和维护线程)

// 基础的创建线程池方式
    ExecutorService executorService = Executors.newCachedThreadPool();
    // 提交一个普通任务
    executorService.execute(() -> {});

    // 提交一个Callable任务
    executorService.submit(() -> {});

    // 创建一个固定初始容量的线程池
    executorService = Executors.newFixedThreadPool(10);

    // 创建一个线程队列排队执行,按照提交任务(Runnable)顺序先进先出执行,但是和主线程是异步的
    executorService = Executors.newSingleThreadExecutor();

 

 

使用异常处理器处理线程运行中出现的异常

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/** 处理线程中的异常方式,通过实现Thread.UncaughtExceptionHandler处理器来实现, 并使用线程池和线程工厂创建 */
public class CaptureUncaughtException {
  // 声明一个任务
  private static Runnable thread2 =
      () -> {
        Thread t = Thread.currentThread();
        System.out.println("run() by" + t);
        System.out.println("eh = " + t.getUncaughtExceptionHandler());
        // 抛出一个异常
        throw new RuntimeException();
      };

  public static void main(String[] args) {
    ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactory());
    exec.execute(thread2);
  }

  /** 给Thread设置默认异常处理器 */
  public static void setDefaultHandler() {
    Thread.setDefaultUncaughtExceptionHandler(
        new Thread.UncaughtExceptionHandler() {

          // 异常处理器处理异常的方法
          @Override
          public void uncaughtException(Thread t, Throwable e) {
            System.out.print("设置了一个默认的异常处理器");
          }
        });
  }
}

class HandlerThreadFactory implements ThreadFactory {

  // 创建一个异常处理器
  private Thread.UncaughtExceptionHandler exceptionHandler =
      (Thread t, Throwable e) -> System.out.println("caught " + e);

  // 使用线程工厂创建线程池生成器
  @Override
  public Thread newThread(Runnable r) {
    System.out.print(this + " creating new Thread");
    Thread t = new Thread(r);
    System.out.println("created " + t);
    // 给每个生成的线程设置一个异常处理器
    t.setUncaughtExceptionHandler(exceptionHandler);
    System.out.println("eh = " + t.getUncaughtExceptionHandler());
    return t;
  }
}

 ThreadLocal,线程本地化,保证变量的值在每个线程都是独享的

// 创建一个ThreadLocal(),值默认为null
    ThreadLocal<Object> threadLocal = new ThreadLocal<>();
    // 创建一个ThreadLocal(),并通过Supplier给定一个初始值
    threadLocal = ThreadLocal.withInitial(UUID.randomUUID()::toString);
    // 从ThreadLocal中获取值
    threadLocal.get();
    // 给ThreadLocal设定值
    threadLocal.set("");

 

posted @ 2020-07-24 21:06  TS小学生  阅读(469)  评论(0)    收藏  举报