因为Java的单继承原因 所以是推荐Runnable接口方式创建线程的,当然除了Runable还有Callable接口形式。
Callable 与 Runnable 相比有以下 2 点不同:
- Callable 可以在任务结束的时候提供一个返回值,Runnable 无法提供这个功能
- Callable 的 call 方法分可以抛出异常,而 Runnable 的 run 方法不能抛出异常。
Callable
其实在 Executor 框架中还有一种方法可以实现异步,那就是实现 Callable 接口并重写call方法。虽然是实现 Callable ,但是在 Executor 实际运行时,会将 Runnable 的实例或 Callable 的实例转化为 RunnableFuture 的实例,而 RunnableFuture 继承了 Runnable 和 Future 接口,
简单实现
记住四部
-
//创建执行服务
ExecutorService sre= Executors.newFixedThreadPool(3);
-
//提交执行
Future<Boolean> restus1=sre.submit(a);
-
//接受结果
restus1.get();
-
//关闭
sre.shutdown();
实例
package com.java.callable;
import java.util.concurrent.*;
/**
* callable 线程创建 还有Thread继承 Runnable接口实现
*/
public class callable implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+"执行了"+i);
}
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建执行服务
ExecutorService sre= Executors.newFixedThreadPool(3);
//提交执行
callable a =new callable();
callable b =new callable();
callable c =new callable();
Future<Boolean> restus1=sre.submit(a);
Future<Boolean> restus2=sre.submit(b);
Future<Boolean> restus3=sre.submit(c);
//接受结果
boolean d=restus1.get();
boolean e=restus2.get();
boolean f=restus3.get();
//关闭
sre.shutdown();
}
}