首页 > 其他分享 >纯手写线程池+async注解实现异步任务

纯手写线程池+async注解实现异步任务

时间:2022-11-07 23:13:17浏览次数:37  
标签:异步 log void public 线程 注解 async class

spring整合多线程---@Async注解

  • 基本配置

    • 启动添加注解

    • @SpringBootApplication
      @EnableAsync
      public class Demo000Application {

          public static void main(String[] args) {
              SpringApplication.run(Demo000Application.class, args);
          }

      }
    • 方法上添加注解

    • @Component
      public class test01 {
          @Async
          public void log(){
              Log log = LogFactory.getLog("log");
              log.info("ok");
          }
      }

手写@Async异步注解

  • controller调用异步方法

    • @RestController
      @RequestMapping("/test")
      public class Test02 {
          @RequestMapping("/async")
          public void asyncLog(){
             //异步方法
              Test01.log();
              System.out.println("----------test--------");
          }
      }
  • 定义异步方法

    • @Component
      public class Test01 {
         //使用自定义注解
          @AwAsync("myExecutor")
          public static void log(){
              System.out.println("-----write log-----");
          }
      }
  • 捕捉自定义注解@AwAsync,异步执行

    • @Component
      @Aspect
      public class AopAnnotation {
         //注入自定义线程池
          @Autowired
          MyExecutor executor;
        
          @Pointcut(value = "@annotation(com.example.demo_000.demo.Controller.My*)")
          public void myPointCut(){}

          @Around("myPointCut()")
          public void log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
              //线程池异步执行目标方法
              executor.execute(() -> {
                  try {
                      proceedingJoinPoint.proceed();
                  } catch (Throwable e) {
                      throw new RuntimeException(e);
                  }
              }); 
          }
      }
    • 补充--自定义线程池

      • @Component
        public class MyExecutor {
            ArrayList<Runnable> threads;
            LinkedBlockingDeque<Runnable> tasks;

            public MyExecutor() {
                threads= new ArrayList<>();
                tasks= new LinkedBlockingDeque<>();
                for (int i = 0; i < 2; i++) {
                    Thread thread = new Thread(() -> {
                        while (true) {
                            Runnable poll = tasks.poll();
                            if (poll != null) {
                                poll.run();
                            }
                        }
                    });
                    thread.start();
                    threads.add(thread);
                }
            }
            public boolean execute(Runnable runnable){
                return tasks.offer(runnable);
            }
        }

标签:异步,log,void,public,线程,注解,async,class
From: https://www.cnblogs.com/new228666/p/16867858.html

相关文章

  • java线程 Thread
    packagecom.tedu.threadStudy;publicclassstudyThread{publicstaticvoidmain(String[]args){MyThreadth1=newMyThread("线程1");My......
  • C#里的多线程,一网打尽thread,task,parallel
    C#里的多线程,一网打尽1.Syncawait2.Thread3.Threadpool4.Task5.Parallel Tasktask=newTask(()=>{});task.Start();Tasktask=Task.Run(()=>{};TaskFactoryta......
  • [2022.11.7]线程
    线程就是独立的执行路径;在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;main()称之为主线程,为系统的入口,用于执行整个程序;在一个进程中,如果开辟了多......
  • 创建两个分线程
    publicclassThreadTest{publicclassvoidmain(String[]args){3.//创建Thread类的子类的对象MyThreadm1=newMyThread1();MyT......
  • 多线程的创建
    1.继承Thread2.重写Thread的run()方法-->将此线程执行的操作声明在run()中3.创建Thread类的子类的对象4.调用此对象调用start 例如:classMyThread extendsThr......
  • java的多线程
    程序program:完成特定任务、用某种语言编写的一组指令的集合。即一段静态的代码,静态对象进程process:程序的一次执行过程,或是正在运行的一段程序。是一个动态的过程,有产生和......
  • 多进程(线程)访问设备的一些疑惑
       同事在看设备驱动同步时,问了我一个事:如果驱动程序创建了一个设备,在应用层是否允许多个进程同时打开这个设备;如果允许,这种方式应用层和驱动的通信方式是否会相互影响......
  • 多线程详解
    1.多线程快速入门1.1进程与线程什么是进程?CPU从硬盘中读取一段程序到内存中,该执行程序的实例就叫做进程。一个程序如果被CPU多次读取到内存中,则变成多个独立的进程......
  • 多线程同步之条件变量
    对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源。而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号......
  • 多线程同步之互斥锁
    对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源。而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号......