1

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

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

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

假设 UserA 在 UserB 正常浏览时上传文件。UserA 上传文件后,UserB 是否会遇到 2 秒延迟?

有没有更好的方法让我在这种情况下暂停代码执行?

编辑:添加代码。我使用 PDF-Renderer 作为我的库:https ://java.net/projects/pdf-renderer

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.     
}
4

1 回答 1

2

假设 UserA 在 UserB 正常浏览时上传文件。UserA 上传文件后,UserB 是否会遇到 2 秒延迟?

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

Thread.sleep(2000) 是最好的代码吗?

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

于 2013-07-31T15:32:53.140 回答