1.实现Callable接口
implements Callable<类型>
重写call()函数,抛出异常
public class D11 implements Callable<Boolean> {
private String url;
private String name;
public D11( String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
Downloader d = new Downloader();
d.download(url, name);
return true;
}
}
创建目标对象和执行服务(与前两种创建线程方法有很大不同)
public static void main(String[] args) throws ExecutionException, InterruptedException {
D11 d1 = new D11("https://img2.woyaogexing.com/2023/01/18/96ecb9c366fbc24bf89e939a788591a0.jpg", "a.jpg");
D11 d2 = new D11("https://img2.woyaogexing.com/2023/01/18/83850eff83baf7fe1b06bea7c1bf2d9d.jpeg","b.jpg");
D11 d3 = new D11("https://img2.woyaogexing.com/2023/01/18/0565fcc0089633a0a1c17aaaff56abd7.png","c.jpg");
ExecutorService s = Executors.newFixedThreadPool(3);
Future<Boolean> r1 = s.submit(d1);
Future<Boolean> r2 = s.submit(d2);
Future<Boolean> r3 = s.submit(d3);
boolean a1 = r1.get();
boolean a2 = r2.get();
boolean a3 = r3.get();
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
s.shutdownNow();
}
2.静态代理
抽象角色:真实对象和代理对象的共同接口
真实角色:真正要引用的对象
代理角色:代理对象内部包含对真实对象的引用,可以操作真实对象,有和真实对象相同的接口,所以可以替代真实对象。可以附加其他操作,对真实对象进行封装。
当一个类实现了Runnable接口,创建线程时,并不是直接用该类调用start(),而是创建Thread类(用该类对象作为参数),调用start()方法。
这就是静态代理,该类为真实角色,Thread类为代理角色,Runnable接口为抽象角色。