Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中是否有回调函数概念可以像Javascript中那样进行异步I/O?_Java - Fatal编程技术网

Java中是否有回调函数概念可以像Javascript中那样进行异步I/O?

Java中是否有回调函数概念可以像Javascript中那样进行异步I/O?,java,Java,我是一名Javascript前端开发人员,但需要编写一个简单的Java程序来编写文件并发送电子邮件和HTTP请求 下面是我用来将日志写入磁盘文件的Java代码: @Override public void log(String text) { Date date = new Date(); DateFormat sdf = new SimpleDateFormat("yyyyMMdd"); DateFormat sdf1 = new SimpleDateForma

我是一名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请求


谢谢

您应该为此使用新线程,这不会阻止主线程

线程意味着您可以一次完成多项任务(简单地说)
您可以按如下方式调用该函数:

new Thread(){
    public void run(){
        log(SOME_TEXT);
    }
}.start();
但请确保线程运行时某些文本不会更改
并确保日志在一段时间内结束,如果不结束,您可以多次记录,并且会有许多线程出现问题。

要了解更多信息,请使用@SergeyPetunin的答案。

Java中最接近的概念是

但是您应该知道,Java有一个多线程并发模型,而不是带有异步并发模型的单线程JavaScript。如果你不熟悉这个概念,那么你最好从一个新的开始


也可以考虑IO操作。

可以使用。您应该实现

Callable
接口。下面是一个

套接字本身是否需要阻止?通常情况就是这样,在Java中,同步执行这种I/O是很典型的,因为您没有阻塞某些UI线程。是的,在Java中使用多线程。如果有人必须做异步,谷歌异步库。请参见我的个人资料,了解一个:)通用并发模型说明+1@sergey,您在第二个链接中提供的java.nio.file文档没有说明它是非阻塞的。这是正确的吗?如果java API提供非阻塞I/O,那就太好了,因为我可以避免并发代码。@NicolasS.Xu这第三个(不是第二个)链接确实有误导性。带有
Java.nio.file
包的NIO2特性(在Java7中引入)是该特性的一部分(在Java1.4中引入)。有几个关于它的教程,例如SelGy:考虑一个更新到你的解释和改变链接。@ SeleEntutuo谢谢,你的链接确实更好。我已经更正了我的答案。谢谢!在我的简单程序中,这种线程()看起来非常可行。