前言
整理下经历过的异步情景和方案
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
3:spring的@Async
注意:被打@Async注解的函数不能由本类内其他函数调用,必须是外部使用者调用,如果内部函数调用会出现代理绕过的问题,从而无法执行异步,不会出错,会变成同步操作。看起来就是@Async失效的状态。 详见: 2018-12-27-springBoot–注解–@Async.md
2:生产、消费者
1:队列
通过生产者生产消息发给Broker保存,消费者监听Broker消费消息。通过解耦合来达到异步的效果。
2:库表
生产者将数据存入库表并初始化状态,消费者阻塞式取数据,根据业务逻辑更新数据状态。
3:缓存
生产者将数据存入缓存中,消费者定时或监听(或者while(true)来监控)从缓存中取数据消费。根据业务逻辑更新状态或移除缓存。