Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程。

package org.github.lujiango;

public class Test10 {

    static class MyThread extends Thread {
@Override
public void run() {
System.out.println("I am extend Thread...");
}
} public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
} }

  

Runnbale:可以通过实现Runnable接口来创建多线程,创建Runnable实现类的实例,并以此作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

package org.github.lujiango;

public class Test11 {

    static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("I am implement Runnable...");
}
} public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
} }

  

Callable:从Java 5开始,Java提供了Callable接口,提供了一个call方法可以作为线程执行体,但是call方法可以有返回值,可以声明抛出异常。Java5提供了Future接口来代表call方法的返回值,并为Future提供了一个FutureTask实现类,该实现类实现了Future和Runnable。

package org.github.lujiango;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class Test12 { static class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "my callable";
}
} public static void main(String[] args) throws InterruptedException, ExecutionException {
MyCallable callable = new MyCallable();
FutureTask<String> future = new FutureTask<String>(callable);
new Thread(future).start();
System.out.println(future.get()); } }

创建线程的三种方式比较:

通过继承Thread类或实现Runnable,Callable接口都可以实现多线程。 
采用Runnable,Callable接口的方式创建多线程 
(1)线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。 
(2)多线程可以共享一个target对象,所以合适多个相同线程来处理同一份资源的情况,从而可以将CPU,代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。 
(3)编程稍微复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法 
采用继承Thread类的方法创建多线程 
(1)因为多线程类已经继承了Thread类,所以不能在继承其它父类。 
(2)编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。

 
 

最新文章

  1. ViewController的生命周期分析和使用
  2. dynamoDb aws config aws_access_key_id aws_secret_access_key golang
  3. windows下CMake使用图文手册 Part 2
  4. [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.
  5. JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(&lt;delimited-identifiers/&gt;、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)
  6. Json.net/Newtonsoft 3.0 新特性JObject/Linq to Json
  7. 深度优先算法DFS
  8. EF4 Code First和EF6 Code First链接mysql的方法
  9. 《Effective C#中文版:改善C#程序的50种方法》读书笔记
  10. webpack入门与解析(一)
  11. Recycleview实现复杂布局
  12. MySql concat与字符转义
  13. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件
  14. SDN概述:简介、工具、环境部署
  15. Cross-site request forgery 跨站请求伪造
  16. MySQL导入导出表数据
  17. vue微信分享链接添加动态参数
  18. HBase入门基础教程之单机模式与伪分布式模式安装(转)
  19. install ros-indigo-laser-geometry
  20. CF1012C Hills 题解【DP】

热门文章

  1. [译]SQL数据库迁移:从低版到高版本
  2. Bower管理依赖库初体验
  3. js禁止复制粘贴
  4. 使用nsswitch控制linux dns解析顺序
  5. 如何在sublime3项目设置中设置python模块的搜索路径?ImportError: No module named *的解决办法
  6. C语言大总结
  7. [转]SQL Server表分区
  8. python numpy学习记录
  9. 理解Vue的状态管理模式Vuex
  10. openwrt web server