1.多线程
Callable 接口有返回值 Runnable 接口没有返回值
所以Callable接口实现的多线程或线程池可以判断每个线程的执行结果
是否符合预期
多线程实现
匿名内部类 实现接口、继承Thread类也可以实现
for (int i = 0;i<10;i++) {
FutureTask 对象接收Callable对象为参数
FutureTask<String> ft=new FutureTask<>(new Callable<String>() {
int money = 10;
@Override
public String call() throws Exception {
String result;
while(money>0) {
System.out.println("钱还剩余:"+money);
money--;
}
result= "钱已用光";
return result;
}
});
new Thread(ft).start(); Thread对象接收FutureTask对象为参数,开启子线程
String result = ft.get(); 获取每一个子线程的执行结果
System.out.println(result);
}
输出为10个循环 钱还剩余 钱已用光
多线程的实现有三种:继承Thread、实现Runnable接口、实现Callable接口或Future
2.线程池
ExecutorService service = Executors.newFixedThreadPool(1000);
定义线程池
for (int i=0;i<1000;i++) {
使用submit方法执行子线程可以获得每个线程的执行结果,
execute方法也会执行子线程却无法获得执行结果
Future<String> future = service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "say helloWorld!!!";
}
});
if (future.get().equals("s")) {
System.out.println("no");
}
else if (future.get().equals("say helloWorld!!!")) {
System.out.println("ok");
}
else {
System.out.println("no");
}
}
service.shutdown();
service.awaitTermination(Long.MAX_VALUE,TimeUnit.SECONDS);
输出为 1000个ok