Spring boot工程中的异步
SpringBoot 工程中默认反对异步操作,然而咱们须要首先在启动类的下面,增加启动异步操作的注解(@EnableAsync)形容,代码如下:
@EnableAsync@SpringBootApplicationpublic class DbpmsApplication { public static void main(String[] args) { SpringApplication.run(DbpmsApplication.class, args); } }
如果此时某个业务办法须要执行异步操作,能够应用@Async 注解对办法进行形容,例如写日志的业务,要害代码如下
@Async//次注解形容的办法为异步切入点办法@Overridepublic void saveLog(SysLog sysLog) { try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("findLogs.thread="+Thread.currentThread().getName()); sysLogDao.insertLog(sysLog);}
其中,@Async 注解形容的办法,在 spring 中会认为这是一个异步切入点办法, 在这个切入点办法执行时,底层会通过告诉办法获取线程池中的线程,通过池中的线程调用切入点办法(底层默认池类ThreadPoolExecutor 类型)
简略应用ThreadPoolExecutor创立线程池
package com.cy;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicLong;public class ThreadPoolExecutorTests { //创立工作队列,存储执行的工作 static BlockingQueue<Runnable> workQueue= new ArrayBlockingQueue<>(1); //构建线程工厂 static ThreadFactory threadFactory=new ThreadFactory() { //线程前缀 private String prefix="pool-thread-task-"; //定义一个提供自增自减机制的对象 private AtomicLong atomicLong=new AtomicLong(1); @Override public Thread newThread(Runnable r) { return new Thread(r, prefix+atomicLong.getAndIncrement()); } }; public static void main(String[] args) { //初始化一个线程池 ThreadPoolExecutor tpool= new ThreadPoolExecutor(1, 2, 3, TimeUnit.SECONDS, workQueue, threadFactory, new ThreadPoolExecutor.AbortPolicy()); tpool.execute(new Runnable() { @Override public void run() { String task=Thread.currentThread().getName()+"->task01"; System.out.println(task); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } }); tpool.execute(new Runnable() { @Override public void run() { String task=Thread.currentThread().getName()+"->task02"; System.out.println(task); try{Thread.sleep(3000);}catch (Exception e){} } }); tpool.execute(new Runnable() { @Override public void run() { String task=Thread.currentThread().getName()+"->task03"; System.out.println(task); try{Thread.sleep(3000);}catch (Exception e){} } }); tpool.execute(new Runnable() { @Override public void run() { String task=Thread.currentThread().getName()+"->task04"; System.out.println(task); try{Thread.sleep(3000);}catch (Exception e){} } }); }}
后果:
pool-thread-task-1->task01pool-thread-task-2->task03pool-thread-task-1->task02//期待3秒呈现
Java多线程:彻底搞懂线程池