一、业务场景:推送订单数据到第三方平台,失败的记录到rides中,并尝试重复推送(时间延迟递增)5次
二、简单的代码实现:
package cn.morik.ufm.common.utils;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class MyThreadPoolExecutor implements Runnable {
AtomicInteger times = new AtomicInteger(0);
//工作任务提交的线程池
ThreadPoolExecutor workerThreadPool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
//定时重复n次线程池
ScheduledExecutorService masterThreadPool = Executors.newSingleThreadScheduledExecutor();
public void startWork() {
pushData();
waitTask();
times.getAndAdd(1);
//第一次延迟重推
masterThreadPool.schedule(this, 60 * 5 * times.get() * 2, TimeUnit.SECONDS);
}
private void pushData() {
for (int i = 0; i < 100; i++) {
workerThreadPool.execute(new WorkerThread("自己造"));
}
}
private void rePushData() {
workerThreadPool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
pushData();
times.getAndAdd(1);
if (times.get() <= 5) {
if (times.get() != 1) {
waitTask();
}
System.out.printf("第" + times.get() + "延迟重推");
masterThreadPool.schedule(this, 60 * 5 * times.get() * 2, TimeUnit.SECONDS);
}
}
// 等待workerThreadPool中的所有线程执行完毕
private void waitTask() {
workerThreadPool.shutdown();
try {
workerThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
System.out.printf(e.getMessage());
}
}
@Override
public void run() {
rePushData();
}
public static void main(String[] args) {
new MyThreadPoolExecutor().startWork();
}
}
class WorkerThread implements Runnable {
String remarkDataJson;
public WorkerThread(String remarkDataJson) {
this.remarkDataJson = remarkDataJson;
}
@Override
public void run() {
//TODO 构造推送数据查库或者去rides取推送失败的数据略
// remarkDataJson.......
}
}