![image]()
package com.guo.demo02;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.net.URL;
import java.util.concurrent.*;
/**
* 创建方式三: 实现callable接口
* callable的好处
* 1.可以定义返回值
*2.可以抛出异常
*/
public class TestCallable implements Callable<Boolean> {
private String url;//网络图片地址
private String name;//保存的文件名
//构造器
public TestCallable(String url,String name){
this.url = url;
this.name = name;
}
//下载图片的线程执行体
@Override
public Boolean call() {
WebDownload webDownload = new WebDownload();
webDownload.downloader(url,name);
System.out.println("下载了文件名为:"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable t1 = new TestCallable("https://img-s.msn.cn/tenant/amp/entityid/AA1YWkc6.img?w=768&h=576&m=6&x=460&y=74&s=142&d=142","肖战.jpg");
TestCallable t2 = new TestCallable("https://inews.gtimg.com/news_bt/Onn7Sa3wKTQqo3UDXI-iGSb4A8LxJvyVsCO4plkYWaF4QAA/641","杨幂.jpg");
TestCallable t3 = new TestCallable("https://n.sinaimg.cn/sinakd10110/192/w1080h1512/20200701/ebaf-ivrxcex9280671.jpg","刘德华.jpg");
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
//获取结果
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
System.out.println(rs1);
System.out.println(rs2);
System.out.println(rs3);
//关闭服务
ser.shutdownNow();
}
}
class WebDownload{
//下载方法
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
}catch (Exception e){
e.printStackTrace();
System.out.println("IO异常,downloader方法出现问题");
}
}
}