我有一个Java客户端(客户端服务器应用程序),主要做两件事:(1)监听服务器以接收文件并将其保存到本地文件夹;(2)监视该文件夹以进行更改并将更改发送到服务器。我想在自己的线程中运行每个。首先,在单独的线程上运行每个任务是个好主意。其次,当任一任务使用该文件夹以避免干扰时,如何锁定该文件夹?
答案 0 :(得分:4)
在单独的线程上运行每个任务是个好主意
将程序拆分为线程听起来是个好主意,因为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();