我有一个Java客户端(客户端服务器应用程序),该客户端执行两项主要任务:(1)侦听服务器以接收文件并将其保存到本地文件夹中,以及(2)监视该文件夹中的更改并将更改发送到服务器。我想在各自的线程中运行它们。首先,在单独的线程上运行每个任务是一个好主意。其次,当任一任务使用该文件夹时,如何锁定该文件夹以避免干扰?

最佳答案

在单独的线程上运行每个任务是一个好主意吗


将程序拆分为多个线程听起来是个好主意,因为这两个任务可以异步并发运行。第一个线程可以在第二个线程上传的同时进行下载。


  当任一任务使用该文件夹时如何锁定该文件夹以避免干扰?


我根本不会做锁。我希望您的第一个线程从服务器读取文件,将其写入文件夹,然后将FileToSend对象(或者可能只是File对象)添加到BlockingQueue。因此,您的第二个线程不必查看目录,而只是在BlockingQueue上等待文件发送到服务器。 LinkedBlockingQueue类对此应该可以很好地工作。 BlockingQueue会为您锁定。

如果确实需要共享锁,则可以将锁对象注入两个线程中:

private final Object folderLock = new Object();
...
new Thread(new Downloader(folderLock)).start();
new Thread(new Uploader(folderLock)).start();
...


一个好的模式是在addFileToUpload(File fileToUpload)类上定义一个Uploader方法。然后,您的Uploader可以决定如何处理它。这样,BlockingQueue可能在Uploader本地

Uploader uploader = new Uploader();
// pass the uploader into the downloader
new Thread(new Downloader(uploader)).start();
new Thread(uploader).start();

09-25 16:59