首先,Runnable和Callable都是接口=。=
Callable接口和Runnable接口的区别就是:
Callable接口需要实现call方法,Runnable接口需要实现run方法;与此同时call方法还可以返回任何对象(因为在Callable接口中可以使用泛型),若不指定,JVM都会当作Object对象来处理,这样在代码中需要相应的类型转换。若指定了泛型的类型,则就不需要了=。=
Callable接口和Runnable接口的不同点有:
①.Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
②.Callable可以返回一个泛型类型V,而Runnable不能做到
③.Callable和Runnable都可以和Executors类(见下边)使用。然而Thread类只能使用Runnable
④.Callable可以抛出checked exception,而Runnable没有。
用Executors来构建线程池步骤:
1).可以调用Executors类中的静态方法newCachedThreadPool(必要时创建新线程,空闲线程会被保留60秒)来创建线程池
也可以调用newFixedThreadPool方法创建固定数量的线程池等,
返回一个实现了ExecutorService接口的ThreadPoolExecutor类或者是一个实现了ScheduledExecutorServiece接口的类对象。
2).调用submit方法或者execute方法提交Runnable或Callable对象,返回一个Future(见下边)接口
3).当不再需要线程池时,可以通过shutdown方法销毁
Future接口:
常用与提取Callable执行的状态。
主要方法有:
①get(),获得Callable的返回值
②cancel(),取消Callable的执行
③isDone(),判断是否已经完成
④isCanceled(),判断是否已经取消
列举两个例子:
一:实现Runnable接口例子
public class Demo1 {
public static void main(String[] args) {
//创建含有5个线程的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
//可以通过execute方法或者submit方法来提交任务
pool.execute(new Task1());
pool.submit(new Task2());
//销毁
pool.shutdown();
}
}
//实现Runnable接口
class Task1 implements Runnable{
@Override
public void run() {
//业务逻辑略
System.out.println("Runnable-----Task1");
}
}
class Task2 implements Runnable{
@Override
public void run() {
//业务逻辑略
System.out.println("Runnable-----Task2");
}
}
二:实现Callable接口例子
public class Demo2 {
public static void main(String[] args) {
ExecutorService e=Executors.newFixedThreadPool(5);
//调用submit方法提交任务
//用Future接口接收
Future f1=e.submit(new MyCallable());
Future f2=e.submit(new MyCallable());
try {
//通过get方法来获取call返回的值
System.out.println(f1.get());
System.out.println(f2.get());
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (ExecutionException e1) {
e1.printStackTrace();
}
//销毁
e.shutdown();
}
}
class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
//简单的返回一个字符串
return "aaaaa";
}
}
会很容易的发现,在实现Runnable接口的run方法中没有返回值,而实现Callable接口的call方法中又返回值而且可以通过get方法获取到
若有不正之处请多多谅解,并欢迎批评指正。