除了继承Thread类和实现Runnable接口两种建立线程的方式,JDK5.0还新增类两种线程建立方式:java
好处:
(1)与使用Runnable相比,Callable功能更强大些
(2)相比run()方法,能够有返回值
(3)方法能够抛出异常
(4)支持泛型的返回值
(5)须要借助FutureTask类,好比获取返回结果
Future接口:
1)能够对具体的Runnable\Callable任务的执行结果进行取消、查询是否完成、获取结果等
2)FutureTask是Future接口惟一的实现类
3)FutureTask同时实现了Runnable,Future接口。
【它既能够做为Runnable被线程执行,又能够做为Future获得Callable的返回值】ide
//1.建立实现类 class NumThread implements Callable { //2.重写call()方法 @Override public Object call() throws Exception { int sum=0; for(int i=1;i<=100;i++){ if(i%2==0){ System.out.println(i); sum+=i; } } return sum; } } public class ThreadNew { public static void main(String[] args) { //3.建立实现Callable接口的实例对象 NumThread numThread = new NumThread(); //4.将实现类的对象做为参数传递到FutureTask构造器,建立 FutureTask对象 FutureTask futureTask = new FutureTask(numThread); //5.将FutureTask的对象做为参数传递到Thread类的构造器中,并调用start() new Thread(futureTask).start(); //6.须要的话,能够借助FutureTask的对象进行一系列操做 try { //get()返回值为FutureTask构造器参数Callable实现类重写的call()的返回值 Object sum = futureTask.get(); System.out.println("总和:"+sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
好处:工具
1)提升响应速度--减小建立新线程的时间
2)下降资源消耗--重复利用线程池中的线程,不须要每次都建立
3)便于线程管理:
corePoolSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间会终止
线程池相关API--ExecutorService和Executors
ExecutorService:真正的线程池接口,常见子类ThreadPoolExecutor
Executors:工具类、线程池的工厂类。用于建立并返回不一样类型的线程池线程