除了继承 Thread 类和实现 Runnable 接口两种创建线程的方式, JDK5.0 还新增类两种线程创建方式:
新增方式一: 实现 Callable 接口
好处:
(1) 与使用 Runnable 相比, Callable 功能更强大些
(2) 相比 run() 方法, 可以有返回值
(3) 方法可以抛出异常
(4) 支持泛型的返回值
(5) 需要借助 FutureTask 类, 比如获取返回结果
Future 接口:
1) 可以对具体的 Runnable\Callable 任务的执行结果进行取消, 查询是否完成, 获取结果等
2)FutureTask 是 Future 接口唯一的实现类
3)FutureTask 同时实现了 Runnable,Future 接口.
[它既可以作为 Runnable 被线程执行, 又可以作为 Future 得到 Callable 的返回值]
创建的过程和实例
- //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: 工具类, 线程池的工厂类. 用于创建并返回不同类型的线程池
来源: http://www.bubuko.com/infodetail-3402188.html