私はJavaクライアント(クライアントサーバーアプリ)を持っています。これは主に2つのことを行います。(1)サーバーをリッスンしてファイルを受信してローカルフォルダーに保存し、(2)そのフォルダーの変更を監視してサーバーに変更を送信します。それぞれを独自のスレッドで実行したいと思います。まず、各タスクを別々のスレッドで実行することをお勧めします。次に、干渉を避けるために、いずれかのタスクで使用されているときにフォルダをロックするにはどうすればよいですか?
1 に答える
各タスクを別々のスレッドで実行することをお勧めしますか
2つのタスクは非同期で同時に動作できるため、プログラムをスレッドに分割することをお勧めします。1番目のスレッドは、2番目のスレッドのアップロードと同時にダウンロードされている可能性があります。
干渉を避けるために、いずれかのタスクで使用されているときにフォルダをロックするにはどうすればよいですか?
私はまったくロックをしません。最初のスレッドでサーバーからファイルを読み取り、それをフォルダーに書き込んでから、FileToSend
オブジェクト(またはFile
オブジェクトのみ)をに追加しますBlockingQueue
。したがって、ディレクトリを確認する代わりに、2番目のスレッドはBlockingQueue
ファイルがサーバーに送信されるのを待機しているだけです。クラスはこれLinkedBlockingQueue
にうまく機能するはずです。はあなたのためにロックのBlockingQueue
世話をします。
ロックを共有する必要がある場合は、2つのスレッドにロックオブジェクトを挿入するだけです。
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();