创建多线程的第三种方式:实现Callable,重写call方法
在这里只是了解,因为不属于我这初级菜鸟要掌握的任务,这个内容属于高级并发编程jvc编程。
案例
package com.cb.thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/*
* 创建线程方式三
* 实现callable + 重写call
*
*
* 推荐:避免单继承的局限性,优先使用接口
*/
public class CDownloader implements Callable<Boolean> {
private String url; //图片地址
private String name; //存储名字
public CDownloader(String url,String name) {
this.url = url;
this.name = name;
}
public Boolean call() throws Exception{
WebDownloader wd = new WebDownloader();
wd.downloader(url, name);
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CDownloader cd1 = new CDownloader("http://pic1.win4000.com/wallpaper/c/579f1942850a7.jpg", "杨洋");
CDownloader cd2 = new CDownloader("http://file06.16sucai.com/2016/0420/faa06f4f0566466e800885110a56cc32.jpg", "婴儿");
CDownloader cd3 = new CDownloader("https://pic.sogou.com/pics/recompic/detail.jsp?category=%E6%98%8E%E6%98%9F&tag=%E5%90%B4%E4%BA%A6%E5%87%A1#33%2617313718", "吴亦凡");
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result1 = ser.submit(cd1);
Future<Boolean> result2 = ser.submit(cd2);
Future<Boolean> result3 = ser.submit(cd3);
//获取结果
boolean r1 = result1.get();
boolean r2 = result2.get();
boolean r3 = result3.get();
//关闭服务
ser.shutdownNow();
}
}
把龟免赛跑的案例改成第三种方法,实现Callable接口+重写call方法
package com.cb.thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/*
* 模拟龟兔赛跑
*/
public class CRacer implements Callable<Integer>{
private String winner; //胜利者
@Override
public Integer call() throws Exception {
for (int steps=0;steps<=100;steps++) {
//模拟兔子休息
if (Thread.currentThread().getName().equals("pool-1-thread-1")&& steps%60==0) {//兔子每走60步休息一次
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"-->"+steps);
//把步数传过去,看比赛是否结束
boolean flag = gameOver(steps);
if(flag){
return steps;
}
}
return null;
}
private boolean gameOver(int steps){
if (winner!=null) {//存在胜利者
return true;
}else {
if (steps==100) {
winner = Thread.currentThread().getName();
System.out.println("胜利者:"+winner);
return true;
}
}
return false;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CRacer racer = new CRacer();
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(2);
//提交执行
Future<Integer> result1 = ser.submit(racer);
Future<Integer> result2 = ser.submit(racer);
//获取结果
Integer r1 = result1.get();
Integer r2 = result2.get();
System.out.println(r1 +"-->"+r2);
//关闭服务
ser.shutdownNow();
}
}