Callable
- 实现Callable接口,需要返回值类型
- 重写call方法,需要抛出异常
- 创建目标对象
- 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
- 提交执行:Future result1 = ser.submit(t1);
- 获取结果:boolean r1 = result1.get()
- 关闭服务:ser.shutdownNow();
案例:利用callable改造下载图片案例
// 第一步:先导包:commons-io-2.6.jar
// 线程创建方式三:实现callable接口
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(){
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
return true;
}
public static void main(String[] args) throws ExecutionException,InterruptedException{
TestCallable t1 = new TestThread2("https://i2.hdslb.com/bfs/face/83bb511365da513c55aa3d1958524f3b7db40684.jpg@96w_96h_1c_1s.webp","1.jpg");
TestCallable t2 = new TestThread2("https://i2.hdslb.com/bfs/face/83bb511365da513c55aa3d1958524f3b7db40684.jpg@96w_96h_1c_1s.webp","2.jpg");
TestCallable t3 = new TestThread2("https://i2.hdslb.com/bfs/face/83bb511365da513c55aa3d1958524f3b7db40684.jpg@96w_96h_1c_1s.webp","3.jpg");
// 1. 创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool(3);
// 2. 提交执行:
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
// 3. 获取结果:
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
// 4. 关闭服务:
ser.shutdownNow();
}
}
//下载器
class WebDownloader{
// 下载方法
public void downloader(String url,String name){
try{
FileUtils.copyURLToFile(new URL(url),new File(name));
}catch(IOException e){
System.out.println("IO异常,Downloader方法出现问题");
}
}
}
小结
callable的好处
- 可以定义返回值
- 可以抛出异常