2009-08-08 11 views
1

長時間実行ファイルオープン操作をキャンセルする方法はありますがキャンセル?上記の例では、長い遅延によるアンチウイルススキャン、マップされたネットワークドライブなどHOWTOは遅延FileInputStreamをファイルオープン

new FileInputStream("a_file_that_the_antivirus_" + 
    "will_process_for_minutes_before_returning.jar") 
// process the contents... 

、最初の行はブロックすることができますが、私たちは新しいを得た場合、私は(非同期的にその操作をキャンセルする方法を知りませんinputstreamオブジェクトの場合、キャンセルはin.close()と同じくらい簡単ですが、この問題はその場合ではありません)。おそらくNIOで - - あるいはすでに単純なThread.interrupt(としてのメカニズムがある)のオープンをキャンセルする

は、それが可能なオープンなプロセスを中断しますか?

OS:主にWindows XP +、Java 6+、ブロックは、通常、Eclipseのプラグインや自分の複雑なアプリケーションなど、より大きく深いjarファイルが原因です。

答えて

1

解決策が見つからなかったとします(OSレベルのコールに陥っていると思われます)。実際にはどれほど悪いワーカースレッドでオープン試行を行い、最終的にはそのスレッドを待ってタイムアウトします。バックグラウンドでは、ワーカースレッドは最終的にオープンを完了しますが、すぐにファイルをすぐに閉じることができます。誰もそれをも​​う待っているわけではありません。

はい、FDリソースをタイアップする予定はなく、おそらく大きくない数字だ - と、とにかく、あなたは影響を制御するためのワーカースレッドの数を絞ることができます。

+2

基本的にファイル全体の処理はすでにSwingWorkerで行われているので、問題はありません。問題は、ユーザーが操作をキャンセルしたい場合、私は確実にオープンをキャンセルすることができないということです - それは、ブロックされたスレッドを保持し、JVMは、例えば正常に終了することはできません。 – akarnokd

+0

私は、別のスレッドでopenを実行し、wait/notifyを使ってそれが完了したことを検出することを考えています。待機は簡単に取り消すことができます。実際のオープンコールは、他のスレッドで実行を継続し、最終的に完了すると破棄されます。 –

+0

それは本当ですが、「結局」は通常遅すぎます。 – akarnokd

0

のFileInputStreamをブロックしています。 Asynchronous File I/O in Javaまたはjava nio

+1

再びああ、ミナのフレームワーク。私はそれをもっと詳しく見なければならないと思う:)しかし、それはLinuxのみを示し、同じファイルオープンの問題を抱えている - それは全く非同期ではない。ファイル/チャンネルが開いていることをNIOで再度確認します。ありがとう。 – akarnokd