1 Warisi kelas Thread dan mengatasi kaedah run:
public class ExtendsThread extends Thread{ @Override public void run() { try{ System.out.println(Thread.currentThread().getName()+"执行"); }catch (Exception e){ } } public static void main(String[] args) { new Thread(new ExtendsThread()).start(); } }
2 dan timpa run benang (dicipta di sini menggunakan rangka kerja kolam benang yang disediakan Pelaksana Kolam benang):
public class ImplementsRunnable implements Runnable{ @Override public void run() { try{ System.out.println(Thread.currentThread().getName()+"执行"); }catch (Exception e){ } } public static void main(String[] args) { new Thread(new ImplementsRunnable()).start(); //这里还可以使用匿名内部类的写法创建一个线程 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行"); } },"匿名内部类实现Runnable接口的线程"); } }
2. Mari kita bincangkan tentang anotasi @Async yang disertakan dengan spring untuk melaksanakan tugas tak segerak
Ia sebenarnya sangat mudah , hanya letakkan anotasi @EnableAsync pada kelas permulaan aplikasi Dayakan penggunaan anotasi tak segerak, dan kemudian tandakan @Async pada kaedah kelas perniagaan.
public class CallableAndFuture implements Callable<String> { @Override public String call() throws Exception { Thread.sleep(3000); System.out.println(Thread.currentThread().getName()+"执行"); return "success"; } public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask = new FutureTask<>(new CallableAndFuture()); // futureTask.run(); 主线程执行call方法 new Thread(futureTask).start(); String result = futureTask.get(); System.out.println(result); } }
public class Executor { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行"); } }); } }
3 Kemudian mari reka bentuk cara menggunakan anotasi tersuai untuk melaksanakan tugas tak segerak
Mula-mula kita menulis anotasi:
@SpringBootApplication @EnableAsync public class AopApplication { public static void main(String[] args) { SpringApplication.run(AopApplication.class, args); } }
Kami meletakkannya pada kaedah kelas perniagaan:
@Async public void insertDb(){ /*service code......*/ System.out.println("2----->收到请求,写入数据库 "); }
Kemudian kami menggunakan AOP untuk mengimbas anotasi ini:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAsync { //规定value是异步开关 boolean value() default false; }
Kami dapat melihat bahawa kami menggunakan Around untuk mencari benang untuk pelaksanaan Selepas menangkap timbunan kaedah yang mengandungi anotasi, objek titik sambungan yang sepadan boleh diperolehi.
Menggunakan kaedah getSignture objek titik sambungan ProcedJoinPoint untuk mendapatkan tandatangan, tandatangan boleh dipaksa untuk ditukar kepada kaedah tandatangan jenis MethdSignture, supaya kaedah getMethod jenis ini boleh digunakan untuk mendapatkan kaedah itu sendiri, dan kemudian anotasi kaedah boleh diperolehi Gunakan atribut anotasi untuk mendapatkan nilai benar atau salah nilai secara langsung, dengan itu menentukan sama ada kaedah itu diluluskan secara serentak atau tak segerak. (Kod sumber menggunakan mekanisme pantulan).
Atas ialah kandungan terperinci Cara Springboot menggunakan anotasi tangkapan Aop untuk melaksanakan pelaksanaan tak segerak perniagaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!