一、继承Thread类重写run方法创建Thread对象调用start方法启动线程二、实现Runnable接口重写run方法创建Thread对象传入Runnable实现类对象调用start方法三、实现Callable接口能够提供返回值创建FutureTask对象传入Callable对象创建Thread对象传入FutureTask对象调用Thread对象的start调用FutureTask对象的get注意FutureTask对象既实现了Runnable接口也组装了Callable接口四、使用线程池实现创建线程池intcoreRuntime.getRuntime().availableProcessors();ExecutorServicethreadPoolnewThreadPoolExecutor(core,core,2,TimeUnit.MINUTES,newLinkedBlockingQueueRunnable(1_000_000),newNamedThreadFactory(xxx));第一个参数核心线程数第二个参数最大线程数第三个参数存活时间第四个参数时间单位第五个参数阻塞队列第六个参数线程工厂还有一个参数拒绝策略四大拒绝策略Java 线程池的四大**拒绝策略RejectedExecutionHandler**是当线程池无法处理新任务时用来决定该任务如何处理的策略。下面我详细整理给你1️⃣ AbortPolicy默认策略特点直接抛出RejectedExecutionException异常阻止系统继续提交任务。适用场景任务提交失败时需要明确知道并采取补救措施或记录日志。示例ExecutorServiceexecutornewThreadPoolExecutor(2,4,60,TimeUnit.SECONDS,newArrayBlockingQueue(2),newThreadPoolExecutor.AbortPolicy());如果线程池满了再提交任务会直接抛异常。2️⃣ CallerRunsPolicy特点由调用者线程自己执行任务而不是抛弃或丢弃。适用场景不希望任务丢失适合降速处理任务通过让调用者自己执行任务来“反馈压力”。示例ExecutorServiceexecutornewThreadPoolExecutor(2,4,60,TimeUnit.SECONDS,newArrayBlockingQueue(2),newThreadPoolExecutor.CallerRunsPolicy());当线程池满了提交任务的线程自己去执行任务能起到流量削峰作用。3️⃣ DiscardPolicy特点直接丢弃被拒绝的任务不抛异常。适用场景可以容忍任务丢失不影响主业务流程。示例ExecutorServiceexecutornewThreadPoolExecutor(2,4,60,TimeUnit.SECONDS,newArrayBlockingQueue(2),newThreadPoolExecutor.DiscardPolicy());线程池满了提交的任务直接被丢弃。4️⃣ DiscardOldestPolicy特点丢弃队列中最旧的任务然后尝试提交新任务即队列头的任务。适用场景希望保证最新任务能够执行优先执行新任务而丢弃老任务。示例ExecutorServiceexecutornewThreadPoolExecutor(2,4,60,TimeUnit.SECONDS,newArrayBlockingQueue(2),newThreadPoolExecutor.DiscardOldestPolicy());线程池满了新任务来了就会把队列中最早的任务丢弃再把新任务加进去。5️⃣ 总结表格策略行为是否抛异常使用场景AbortPolicy拒绝任务并抛异常是需要明确失败通知CallerRunsPolicy调用者线程执行任务否压力反馈削峰DiscardPolicy直接丢弃任务否可以容忍任务丢失DiscardOldestPolicy丢弃队列最旧任务否保证新任务优先执行