我是一个Javascript前端开发人员,但需要编写一个简单的Java程序来编写文件和发送电子邮件和HTTP请求。
下面是我用来将日志写入磁盘文件的Java代码:
@Override
public void log(String text) {
Date date = new Date();
DateFormat sdf = new SimpleDateFormat("yyyyMMdd");
DateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
String logDateString = sdf.format(date);
//System.out.println("logDateString: " + logDateString);
BufferedWriter bwToUse = null;
if(logDateString.compareTo(m_firstOpenDate) == 0) {
// use old buffer writer
bwToUse = this.m_bw;
} else {
// generate new buffer writer
// update m_firstOpenDate
m_firstOpenDate = logDateString;
try {
// close previous day log
this.m_bw.close();
this.m_fw = new FileWriter(m_path + logDateString + ".log", true);
this.m_bw = new BufferedWriter(this.m_fw);
bwToUse = this.m_bw;
} catch (IOException e) {
e.printStackTrace();
}
}
try {
bwToUse.write(sdf1.format(date) + ": " + text + "n");
bwToUse.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
您可以忽略该细节。
我真正的问题是,对于那些繁重的IO操作,例如:文件读取,发送电子邮件和发出HTTP请求(将数据发送到web钩子),如何在Java中以非阻塞异步方式完成?我知道在Javascript中使用回调是标准的,但在Java中,你如何做异步http请求?
谢谢!
Java中最接近的概念是Future。
但是您应该意识到Java具有多线程并发模型,而不是具有异步并发模型的单线程JavaScript。如果你不熟悉这个概念,那么你最好从教程开始。
对于IO操作,你应该考虑非阻塞IO API
您可以使用FutureTask。您应该实现Callable
接口。下面是一个示例
你应该使用new Thread,它不会阻塞主线程
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
线程意味着你可以一次做多件事(简单地告诉)
你可以这样调用这个函数:
new Thread(){
public void run(){
log(SOME_TEXT);
}
}.start();
但是要确保SOME_TEXT在线程运行时不会改变
并确保日志在一定时间内结束,如果它不会,你可以记录多次,将有许多线程可以制造麻烦。
要了解更多信息,请使用@SergeyPetunin的答案。