1. 程式人生 > 實用技巧 >多執行緒之實現Callable介面完成同步下載檔案

多執行緒之實現Callable介面完成同步下載檔案

匯入依賴

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.7</version>
</dependency>

建立Thread1 類 實現多執行緒下載檔案

public class Thread1 implements Callable<Boolean> {
    //網路地址
    private String url;
    //儲存的檔名
    private String name;
    public Thread1(String url, String name) {
        this.url = url;
        this.name = name;
    }
    //下載檔案的執行緒執行體
    @Override
    public Boolean call() {
        FileDownLoader fileDownLoader = new FileDownLoader();
        fileDownLoader.downLoader(url,name);
        System.out.println("下載了檔名為:" + name);
        return true;
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Thread1 t1 = new Thread1("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1887333225,3220403259&fm=26&gp=0.jpg","紫霞仙子.jpg");
        Thread1 t2 = new Thread1("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1115306696,372850764&fm=26&gp=0.jpg","冰霜戀舞曲.jpg");
        Thread1 t3 = new Thread1("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3005655293,1504161907&fm=26&gp=0.jpg","元素使.jpg");
        //建立執行服務
        ExecutorService service = Executors.newFixedThreadPool(3);
        //提交執行
        Future<Boolean> f1 = service.submit(t1);
        Future<Boolean> f2 = service.submit(t2);
        Future<Boolean> f3 = service.submit(t3);
        //獲取結果
        Boolean rs1 = f1.get();
        Boolean rs2 = f2.get();
        Boolean rs3 = f3.get();
        //關閉服務
        service.shutdown();
    }
}

//下載器
class FileDownLoader{
    // 下載方法
    public  void downLoader(String url,String name) {
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO異常:downLoader方法出錯");
        }
    }
}

Callable的的優點:

  • 可以自定義返回值
  • 可以丟擲異常