Java 如何在呈现页面之前获取线程响应

Java 如何在呈现页面之前获取线程响应,java,multithreading,servlets,Java,Multithreading,Servlets,我有一个需要文件操作的应用程序,需要同时执行 如果用户试图读取文件,其他用户将无法执行写入操作 如果用户试图写入文件,则其他用户无法执行读取操作 应用的业务逻辑: 使用Runnable接口创建线程,并添加同步读取方法从远程位置读取属性文件,并将其放入会话/请求对象 问题:启动新线程时,响应将完成(因为线程是独立的执行路径)。因此属性值不可用 如何在显示页面之前获得线程响应?我听说我们可以使用可调用接口,请分享适合这种情况的最佳方法。以这种方式在servlet中创建线程(启动可运行的,并直接由

我有一个需要文件操作的应用程序,需要同时执行

  • 如果用户试图读取文件,其他用户将无法执行写入操作
  • 如果用户试图写入文件,则其他用户无法执行读取操作
  • 应用的业务逻辑:

    使用Runnable接口创建线程,并添加同步读取方法从远程位置读取属性文件,并将其放入会话/请求对象

    • 问题:启动新线程时,响应将完成(因为线程是独立的执行路径)。因此属性值不可用


    如何在显示页面之前获得线程响应?我听说我们可以使用可调用接口,请分享适合这种情况的最佳方法。

    以这种方式在servlet中创建线程(启动可运行的
    ,并直接由JVM运行)是完全没有意义的,不建议使用,因为内存泄漏和非托管上下文

    新线程完全可以获得请求/会话上下文的未定义/不稳定状态

    由于线程是异步启动的,servlet/服务器上下文将继续工作并响应客户机,请求上下文不再有效

    您可以通过互斥来实现,因为servlet上下文在默认情况下是多线程的,您可能永远也不会以这种方式运行线程。如果您这样做,您可以通过会话上下文侦听器来实现,以处理事件并防止任何可能的内存泄漏

    您可以在相关上下文(文件)被锁定时等待(阻止)响应,这不是很合乎逻辑。或者通知用户由于另一次读/写操作,请求的文件被锁定。
    当然,您需要一个类似推送的方法(比如websockets)或替代方法(通过ajax或重载检查状态)来检查最新的相关上下文状态


    最合乎逻辑的方法是,您需要在队列模式下进行更改,只需确保需要更改的文件部分在最新状态下有效。

    您使用的是spring还是straight Servlet?我使用的是纯Servlet,没有框架您可以使用Runnable共享代码吗?如果我理解正确,我认为您需要将响应作为参数传递给线程处理它。但如果您共享一些代码,它会更清晰。