海码充电站的技术专栏 java Coder

异步方案总结


异步方案总结

前言

整理下经历过的异步情景和方案

1:程序中

1:线程
  • 1:通过实现 Runnable 接口来创建线程 ```java class Ticket implements Runnable { private int tick = 100; public void run() { while(true) { if(tick>0) { System.out.println(Thread.currentThread().getName()+”….sale : “+ tick–); } } } }

class TicketDemo { public static void main(String[] args) {

    Ticket t = new Ticket();

    Thread t1 = new Thread(t);//创建了一个线程;
    Thread t2 = new Thread(t);//创建了一个线程;
    Thread t3 = new Thread(t);//创建了一个线程;
    Thread t4 = new Thread(t);//创建了一个线程;
    t1.start();
    t2.start();
    t3.start();
    t4.start();    
} } ``` * 2:通过继承 Thread 来创建线程 ```java class Test extends Thread {
//private String name;
Test(String name)
{
    //this.name = name;
    super(name);
}
public void run()
{
    for(int x=0; x<60; x++)
    {
        System.out.println((Thread.currentThread()==this)+"..."+this.getName()+" run..."+x);     //Thread.currentThread():获取当前线程对象
    }
}

}

class ThreadTest { public static void main(String[] args) { Test t1 = new Test(“one—”); Test t2 = new Test(“two+++”); t1.start(); t2.start();

    for(int x=0; x<60; x++)
    {
        System.out.println("main....."+x);
    }
} } ```
2:线程池
 @Bean("taskExecutor")
        public Executor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setKeepAliveSeconds(60);
            executor.setThreadNamePrefix("taskExecutor-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }

或者使用com.google.common的ThreadFactoryBuilder创建ThreadFactory ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(“userJobDiary-pool-%d”).build(); ThreadPoolExecutor taskExecutor = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1024), threadFactory, new ThreadPoolExecutor.AbortPolicy()); taskExecutor.execute(new Runnable()...);

3:spring的@Async

注意:被打@Async注解的函数不能由本类内其他函数调用,必须是外部使用者调用,如果内部函数调用会出现代理绕过的问题,从而无法执行异步,不会出错,会变成同步操作。看起来就是@Async失效的状态。 详见: 2018-12-27-springBoot–注解–@Async.md

2:生产、消费者

1:队列

通过生产者生产消息发给Broker保存,消费者监听Broker消费消息。通过解耦合来达到异步的效果。

2:库表

生产者将数据存入库表并初始化状态,消费者阻塞式取数据,根据业务逻辑更新数据状态。

3:缓存

生产者将数据存入缓存中,消费者定时或监听(或者while(true)来监控)从缓存中取数据消费。根据业务逻辑更新状态或移除缓存。


相关帖子

Comments