Java 要在servlet操作中创建同步数据下载吗
我想创建一个如下所示的servlet方法。在这种方法中,我想执行一些数据下载。因此,如果有数据下载请求,我只需进行下载。如果已经有一个下载正在进行,我希望第二个请求以某种方式等待,直到第一个线程完成下载。第一个线程完成下载后,第二个线程可以自动启动Java 要在servlet操作中创建同步数据下载吗,java,multithreading,servlets,thread-safety,mutex,Java,Multithreading,Servlets,Thread Safety,Mutex,我想创建一个如下所示的servlet方法。在这种方法中,我想执行一些数据下载。因此,如果有数据下载请求,我只需进行下载。如果已经有一个下载正在进行,我希望第二个请求以某种方式等待,直到第一个线程完成下载。第一个线程完成下载后,第二个线程可以自动启动 DoTheDownloadAction(){ } 我怎样才能达到上述要求 听起来像是信号量的完美候选,或者(取决于复杂性和下游效应)影响相同更改的更简单方法是将下载代码与应用程序的相关键同步 考虑到您有一个DownloadHelper类,并且在S
DoTheDownloadAction(){
}
我怎样才能达到上述要求 听起来像是信号量的完美候选,或者(取决于复杂性和下游效应)影响相同更改的更简单方法是将下载代码与应用程序的相关键同步 考虑到您有一个
DownloadHelper
类,并且在Servlet中创建了该类的一个实例,那么您可以执行如下操作:
DoTheDownloadAction() {
synchronized(downloadHelper) {
//Downloading something
}
}
让我们想象一下,在jsp中有一个名为“下载”的按钮,其id为“下载”,javascript中有此代码
var globalDownloadStatus = false;
jQuery(document).ready(function(){
jQuery('#download'(.click(function(){
if(globalDownloadStatus == true) {
alert('download already in progress, please wait');
return;
}
jQuery.get('yourservletpath', function(data){
alert('Download Complete');
});
});
});
考虑到web服务器通常可以进行分布式扩展。通常,合适的解决方案是通过数据库锁进行同步。然而,对于您来说,在想要等待的对象上使用
synchronized
java关键字就足够了
此外,您正在请求一个悲观锁。这通常是糟糕的架构设计。如果连接多个客户端,下载速度会非常慢。我还会有一个jsp页面,显示当前正在进行下载。Soe如果用户想要进行第二次下载,他应该得到一条消息,说明一次下载已经开始了。我怎样才能做到这一点呢?嗯,在这种情况下,你需要在jsp页面上设置一个下载计数器,比如说你正在使用ajax,你有一个标志来检查下载是否完成,如果标志为false,那么通知用户或者开始下载。你能帮我做更多吗。可能您可以帮助设计jsp页面和操作类。:)我将有一个jsp页面也将显示下载正在进行。Soe如果用户想要进行第二次下载,他应该得到一条消息,说明一次下载已经开始了。我怎样才能做到这一点?你们有数据库吗?如果是,则将下载状态保留在此处。然后有人开始下载,更改记录。然后有人尝试-检查记录。如果您想要纯java解决方案,请使用
java.util.concurrent.locks.ReentrantLock#tryLock()