Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 正在强制服务器等待,因为映像已关闭';我没有完成对磁盘的写入_Java - Fatal编程技术网

Java 正在强制服务器等待,因为映像已关闭';我没有完成对磁盘的写入

Java 正在强制服务器等待,因为映像已关闭';我没有完成对磁盘的写入,java,Java,我有一个网站,当用户上传PDF文件时,它会被发送到服务器,进行一些PDF渲染,并创建一个.png文件以显示为PDF预览缩略图 问题是当创建.png时,写入磁盘的速度比整个执行速度慢,这会导致图像在站点上显示为错误,因为它试图访问不存在的图像(因为写入磁盘之前代码已完成) 在.png创建之后,我添加了一个线程.sleep(2000),它似乎解决了这个问题。现在我的问题是,对于我的情况,Thread.sleep(2000)是最好的代码吗?我不知道这些代码是否会影响多个用户访问我的网站并上传文件 假设

我有一个网站,当用户上传PDF文件时,它会被发送到服务器,进行一些PDF渲染,并创建一个.png文件以显示为PDF预览缩略图

问题是当创建.png时,写入磁盘的速度比整个执行速度慢,这会导致图像在站点上显示为错误,因为它试图访问不存在的图像(因为写入磁盘之前代码已完成)

在.png创建之后,我添加了一个
线程.sleep(2000)
,它似乎解决了这个问题。现在我的问题是,对于我的情况,
Thread.sleep(2000)
是最好的代码吗?我不知道这些代码是否会影响多个用户访问我的网站并上传文件

假设UserA上传一个文件,而UserB正常浏览。UserA上传文件后,UserB是否会经历2秒的延迟

在这种情况下,有没有更好的方法来暂停代码执行

编辑:添加代码。我正在使用PDF渲染器作为我的库:

假设UserA上传一个文件,而UserB正常浏览。之后 UserA上传文件时,UserB是否经历了2秒的延迟

只有当UserB和UserA的请求由同一个线程处理时,UserB才会经历延迟,但情况并非如此,因为大多数web服务器使用单独的线程来处理每个连接

sleep(2000)是最好的代码吗


不,这可能不是一个好的做事方式。除了占用cpu之外,当您无法保证文件将在此时准备就绪时,您还显式地让线程在尝试访问文件之前等待2秒钟。最好尝试利用Java的wait()和notify()实现并发性。但是,我不知道这是否必要,因为您应该知道写入磁盘的操作何时完成(java方法将返回)。

UserB不应该经历延迟,因为
Thread.sleep
只影响当前线程如何将文件写入磁盘?如果您使用的是OutputStream,请尝试刷新()并将其关闭()。在这些操作之后,文件应该存在。使用
ExecutorService
Map
以及
Future
s作为values@Matthias,我正在使用ImageIO.write。我没有想到冲水/关门。我会试一试。@fge,你能用(更详细的)答案写出来吗?为什么这比使用
join
?如何判断磁盘写入是否完成?是的,在原始帖子中添加了它。您可以查看outputFile的大小,以确保它也已写入您的convertPDFtoImage()中方法,直到您确定写入已发生,才从该方法返回。我从类似的问题中看到了此解决方案:。它看起来是一个更好的解决方案,但仍然使用Thread.sleep()。你认为使用它仍然安全吗?这就是我在上一次评论中提出的建议。它至少确保文件在从方法返回之前已写入。可能有更好的解决办法。。但我认为这样做很好。
public static void convertPDFtoImage () throws IOException {
    RandomAccessFile raf = new RandomAccessFile (new File (rep.pathSamplePDF), "r");
    FileChannel fc = raf.getChannel ();
    ByteBuffer buf = fc.map (FileChannel.MapMode.READ_ONLY, 0, fc.size ());
    PDFFile pdfFile = new PDFFile (buf);

    PDFPage firstPage = pdfFile.getPage(1);
    Rectangle2D r2d = firstPage.getBBox ();
    int width = (int) r2d.getWidth ();
    int height = (int) r2d.getHeight ();

    Image pdfImage = firstPage.getImage(width, height, r2d, null, true, true);

    BufferedImage imageToSave = (BufferedImage) pdfImage;

    File outputFile = new File("public/pdfpreview/" + someName + ".png");
    ImageIO.write(imageToSave, "png", outputFile);  //Trying to delay this part so that it can finish writing to disk
    Thread.sleep(2000)  //If I put this code here, it fixes my problem.     
}