Java中三种创建线程的方式有何区别
-
继承Thread类
- 子类继承Thread类具备多线程能力
- 启动线程:创建子类实例,直接调用父类Thread的start方法
- 缺点:OOP单继承的局限性
-
实现Runnable接口
- 实现Runnable接口具备多线程能力
- 创建线程:向Thread对象传入目标对象,通过Thread对象调用start方法
- 优点:避免了OOP单继承的局限性,灵活方便,方便同一个对象被多个线程使用()
-
实现Callable接口
- 实现Callable接口具备多线程能力
- 启动线程:需要创建执行服务,提交任务执行,最后还需要关闭服务。(启动线程的方式不止这一种)
- 优点:可以获取执行结果;声明式的抛出异常,减少了了某些情况下的程序开发复杂度;
- 与Runnable接口的区别:
1. 实现Callable接口需要实现call()方法,而实现Runnable接口需要实现run()方法
2. Callable和Runnable都可以应用于executors,而Thread类只支持Runnable.
3. Callable与executors联合在一起,在任务完成时可立刻获得一个更新了的Future。而Runable需要自己处理。
注:Future接口,一般用于取回Callable执行的状态。其中的主要方法:
1.cancel(),取消Callable的执行,当Callable还没有完成时。
2.get(),获得Callable的返回值.
3.isCanceled(),判断是否取消了.
4.isDone(),判断是否完成.