在for循环java中的下一次迭代之前的wait()

时间:2014-01-08 14:45:54

标签: java loops for-loop wait notify

我在这里要做的是逐个上传文件。例如,如果我的文件列表包含2个准备上传的文件,我想在上传和创建第一个文件后上传第二个文件。

实际上,我循环文件列表并从每次迭代中上传文件,等待上次上传完成。

这是我想要的想法:

for(FileContainerBean fileContainer:fileContainerList){

    FileUpload fileUpload=new FileUpload(fileContainer.getFile());
    Thread th=new Thread(fileUpload);
    th.start();

    //Now i want here to wait beafore moving to the next iteration

    while(!fileContainer.isCreated(){
          wait();
        }
    if(fileContainer.isCreated(){
       notify();
      }
}

fileContainer是一个带有getter和setter的bean(setFile,getFile,isCreated ....)。

当上传结束并创建文件时(HttpResponseCode = 201),fileContainer.isCreated = true。最初,isCreated = false;

我希望我足够清楚!那么可以这样做吗?

提前致谢!

伊斯梅尔

3 个答案:

答案 0 :(得分:1)

所以你基本上只想在th线程完成后才继续执行?只是不要在单独的线程中运行它,而是:

for(FileContainerBean fileContainer:fileContainerList){
    FileUpload fileUpload=new FileUpload(fileContainer.getFile());
    fileUpload.run();

    // continues after the file is uploaded
}

如果你想将它保存在一个单独的线程中(正如你在评论中所说的那样),那么在后台执行整个循环:

    Runnable uploadJob = new Runnable() { 
        public void run() {
            for(FileContainerBean fileContainer:fileContainerList){
                FileUpload fileUpload=new FileUpload(fileContainer.getFile());
                fileUpload.run();
                // continues after the file is uploaded
            }
        }
    };

    new Thread(uploadJob).start();

答案 1 :(得分:0)

这样做

 while(true){
     if(fileContainer.isCreated()){
       break;
     }
 }      

答案 2 :(得分:0)

您应该在线程notify()的{​​{1}}方法中设置run,以便在新线程完成上传后,它将通知等待的线程。

或者我发现您希望主线程等到上传过程完成,那么为什么不简单地让程序单线程化。
我的意思是不要在新线程中启动上传过程,因为默认行为是等到当前上传完成然后开始第二次上传,这就是你想要的。