系统性能优化时我们会对一些耗时操作进行异步处理,最常见的就是http请求,但java中怎么编写异步操作呢,下面我们就来介绍几种方法。
一、使用接口
1.1 编写接口,用于接收异步线程回调的数据
public interface HttpCallBackListener {
// 成功回调函数
void onFinish(String response);
// 失败回调函数
void onError(Exception e);
}
1.2 发送http请求
public class HttpUtil {
public static void sendHttpRequest(final String address, final HttpCallBackListener listener) {
new Thread(new Runnable() {
public void run() {
HttpUrlConnection connection = null;
try {
// 这里发送http请求
...
if(null != listener) {
// 回调函数接收响应数据
listener.onFinish(response.toString());
}
} catch(Exception e) {
if(null != listener) {
// 回调函数接收异常数据
listener.onError(e);
}
} finally {
if(null != connection) {
// 关闭连接
connection.disconnection();
}
}
}
}).start();
}
}
1.3 调用http请求方法,异步接收数据
final String address = "http://xxx.com";
HttpUtil.sendHttpRequest(address, new HttpCallBackListener() {
@Override
public void onFinish(String response) {
// 这里处理接收到的数据
}
@Override
public void onError(Exception e) {
// 这里处理异常情况
}
});
二、使用ExecutorService
2.1 定义接口回调函数
public interface CallBack {
void process();
}
2.2 定义线程执行类,开启子线程异步处理
public class ThreadExecutor {
private static ExecutorService service = Executors.newCachedThreadPool();
public static void excute(final CallBack callBack) {
service.execute(new Runnable() {
@Override
public void run() {
try {
// 执行回调函数处理业务逻辑
callBack.process();
} catch(Exception e) {
// 处理异常情况
}
}
});
}
}
2.3 调用异步方法
final String address = "http://xxx.com";
final String data = "xxx";
// 调用异步处理发送http请求
ThreadExecutor.excute(new CallBack() {
@Override
public void process() {
// 该方法是同步方法
String response = HttpUtil.sendRequest(address, data);
// 这里处理业务逻辑,这块的处理将在子线程内进行,属于异步操作,
// 原先同步耗时的操作都可以不需要修改的放在这里进行优化异步处理
}
});
三、spring boot在启动的时候可以注解支持异步函数
3.1 注解支持异步函数
@SpringBootApplication
@EnableAsync // 启动异步执行函数
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.2 编写异步函数
@Component // spring 管理的组件
public class MyAsync {
private static final Logger LOG = LoggerFactory.getLogger(MyAsync.class);
/**
* 该函数属性异步函数
* @param name
*/
@Async
public void testAsync(String name) {
try {
LOG.info("Name is " + name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}