我的代碼調用從互聯網下載文件的API方法。由於下載需要很長時間,因此如果用戶在後臺線程處理文件下載時關閉顯示進度條的窗口,我想讓用戶能夠取消下載。如何在不終止執行此操作的線程的情況下取消文件上載/下載操作?
我不確定我對API方法調用的代碼有任何控制權,所以我假設我沒有選擇通知此代碼需要取消下載操作。
如果這個假設是正確的,我該如何終止用戶請求上的文件下載操作,而不必中止/中斷或以其他方式終止執行實際文件下載的後臺線程?
我的代碼調用從互聯網下載文件的API方法。由於下載需要很長時間,因此如果用戶在後臺線程處理文件下載時關閉顯示進度條的窗口,我想讓用戶能夠取消下載。如何在不終止執行此操作的線程的情況下取消文件上載/下載操作?
我不確定我對API方法調用的代碼有任何控制權,所以我假設我沒有選擇通知此代碼需要取消下載操作。
如果這個假設是正確的,我該如何終止用戶請求上的文件下載操作,而不必中止/中斷或以其他方式終止執行實際文件下載的後臺線程?
我期望一個設計合理的文件下載方法是可以中斷的。所以你需要中斷正在執行下載的線程,這應該取消下載(該方法應該拋出一個InterruptedException)。
一旦您從下載線程中發現異常,您可以決定如何處理,例如等待提交新文件下載(即不退出)。
我正確地假設apache commons文件的下載方法是可中斷的嗎? –
@JSmith他們是否會拋出InterruptedException?如果他們這樣做,那麼你可以安全地假設他們是。無論如何,測試相當容易。如果他們不存在可能的解決方法(例如通過關閉另一個線程的連接)。 – assylias
如果你有權訪問套接字,就關閉它,它會向線程拋出一個異常,否則我建議你通過一個包含兩個線程(取消監聽器和下載文件)的進程運行它,該文件下載文件是守護進程,任何取消方法只是發出取消線程的信號,然後取消線程就完成了它的工作,導致文件下載靜默地殺死像[this](http://stackoverflow.com/questions/17577908/java-why- is-this-code-not-working-infinite-loop/17580110#17580110) – 2013-07-12 19:55:02