0

私はJavaクライアント(クライアントサーバーアプリ)を持っています。これは主に2つのことを行います。(1)サーバーをリッスンしてファイルを受信して​​ローカルフォルダーに保存し、(2)そのフォルダーの変更を監視してサーバーに変更を送信します。それぞれを独自のスレッドで実行したいと思います。まず、各タスクを別々のスレッドで実行することをお勧めします。次に、干渉を避けるために、いずれかのタスクで使用されているときにフォルダをロックするにはどうすればよいですか?

4

1 に答える 1

4

各タスクを別々のスレッドで実行することをお勧めしますか

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();
于 2012-10-01T00:23:13.963 に答える