1.实现callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务:ExecutorService ser=Exectutors.newFixedThreadPool();
5.提交执行:Future result1=ser.submit(t1);
6.获取结果:boolean r1=result1.get();
7.关闭服务:ser.shutdownNow();
package Threads;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import java.net.URL;
import java.util.concurrent.*;
//线程创建方式三,实现Callable
/*
Callable好处:
1.可以定义返回值
2.可以抛出异常
*/
public class Main implements Callable {//要有返回值类型
//创建变量
private String url;
private String name;
public Main(){}
public Main(String url,String name){
this.url=url;
this.name=name;
}
//线程体:下载图片线程的执行体
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 {
Main t1=new Main("https://img01.sogoucdn.com/app/a/100520021/3b453574cfbfd216bc9e22b7aedb75a3","1.jpg");
Main t2=new Main("https://img01.sogoucdn.com/app/a/100520021/3b453574cfbfd216bc9e22b7aedb75a3","2.jpg");
Main t3=new Main("https://img01.sogoucdn.com/app/a/100520021/3b453574cfbfd216bc9e22b7aedb75a3","3.jpg");
//创建执行服务:Exectutors
ExecutorService ser= Executors.newFixedThreadPool(3);//创建3个池子
//把线程,提交执行:
Future result1=ser.submit(t1);
Future result2=ser.submit(t2);
Future result3=ser.submit(t3);
//获取结果:会有异常抛出就行
boolean r1=result1.get();
boolean r2=result2.get();
boolean r3=result3.get();
//打印返回值
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
//关闭服务:
ser.shutdownNow();
}
}
//下载器
class WebDownloader{
//下载方法
public void downloader(String url,String name){
try{
//copyURLToFile:把网上的文件地址,变成一个文件,new URL(url):添加一个网络路径,new File(name):添加一个文件路径
FileUtils.copyURLToFile(new URL(url),new File(name));
}catch(IOException e){
e.printStackTrace();
System.out.println("IO异常,downloader出现问题");
}
}
}