多线程总结
线程池的使用(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("");

浙公网安备 33010602011771号