如何在页面呈现之前获取Thread响应

时间:2017-07-02 15:11:22

标签: java multithreading servlets

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

  1. 如果用户尝试读取文件,则其他用户无法执行WRITE操作
  2. 如果用户尝试写入文件,则其他用户无法执行READ操作
  3. 应用了业务逻辑:

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

    • 问题:启动一个新线程时,响应结束(因为线程是独立的执行路径)。所以属性值不可用

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

1 个答案:

答案 0 :(得分:0)

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

完全自然地,新线程会获得请求/会话上下文的未定义/不稳定状态。

由于线程异步启动,servlet / server上下文继续工作并响应客户端,请求上下文不再有效。

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

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

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