我有一个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();