Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 要在servlet操作中创建同步数据下载吗_Java_Multithreading_Servlets_Thread Safety_Mutex - Fatal编程技术网

Java 要在servlet操作中创建同步数据下载吗

Java 要在servlet操作中创建同步数据下载吗,java,multithreading,servlets,thread-safety,mutex,Java,Multithreading,Servlets,Thread Safety,Mutex,我想创建一个如下所示的servlet方法。在这种方法中,我想执行一些数据下载。因此,如果有数据下载请求,我只需进行下载。如果已经有一个下载正在进行,我希望第二个请求以某种方式等待,直到第一个线程完成下载。第一个线程完成下载后,第二个线程可以自动启动 DoTheDownloadAction(){ } 我怎样才能达到上述要求 听起来像是信号量的完美候选,或者(取决于复杂性和下游效应)影响相同更改的更简单方法是将下载代码与应用程序的相关键同步 考虑到您有一个DownloadHelper类,并且在S

我想创建一个如下所示的servlet方法。在这种方法中,我想执行一些数据下载。因此,如果有数据下载请求,我只需进行下载。如果已经有一个下载正在进行,我希望第二个请求以某种方式等待,直到第一个线程完成下载。第一个线程完成下载后,第二个线程可以自动启动

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()