创建线程的三种方式

本文详细介绍了在Java中创建线程的三种主要方法:继承Thread类、实现Runnable接口和实现Callable接口。对比了这三种方法的优缺点,推荐使用实现Runnable或Callable接口的方式,以充分利用Java的单继承特性和面向对象思想。

第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务。
第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务。
第三种方法:实现callable接口,重写call()方法,call()作为线程的执行体,具有返回值,并且可以对异常进行声明和抛出
使用start()方法来启动线程
优点:因为JAVA是单继承机制,当我们继承Thread类后就不能继承其他类了,所以我们推荐实现Runnable接口来创建线程。

1.通过继承Thread类来创建一个线程:
步骤1:定义一个继承Thread类的子类:
Java代码

class SomeThead extends Thread   { 
  public void run()   { 
  //处理逻辑   }   } 
  步骤2:构造子类的一个对象: 
 SomeThread oneThread = new SomeThread();   
  步骤3:启动线程:   
 oneThread.start(); 
  一个线程就创建完成了。

2.通过实现Runnable接口来创建Thread线程:
步骤1:创建实现Runnable接口的类:
Java代码

 class SomeRunnable implements Runnable   { 
  public void run()   { 
  //处理逻辑   }  
 } 
  步骤2:创建一个类对象: 
  Runnable oneRunnable = new SomeRunnable();   
  步骤3:由Runnable创建一个Thread对象:   
  Thread oneThread = new Thread(oneRunnable);   
  步骤4:启动线程:   
  oneThread.start(); 
  一个线程就创建完成了。 

3.通过Callable和Future创建线程
第一步:创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
第二步:创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
第三步:使用FutureTask对象作为Thread对象的target创建并启动新线程。
第四步:调用FutureTask对象的get()方法来获得子线程执行结束后的返回值其中,Callable接口(也只有一个方法)定义如下:

 public interface Callable   { 
  V call() throws Exception;   } 
  步骤1:创建实现Callable接口的类SomeCallable();   
  步骤2:创建一个类对象: 
      Callable oneCallable = new SomeCallable(); 
  步骤3:由Callable创建一个FutureTask对象:   
    FutureTask oneTask = new FutureTask(oneCallable); 
  注释: FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了 Future和Runnable接口。 
  步骤4:由FutureTask创建一个Thread对象:   
    Thread oneThread = new Thread(oneTask);   
  步骤5:启动线程:  
    oneThread.start(); 
  一个线程就创建完成了

通过继承Thread类或实现Runnable、Callable接口都可以实现多线程,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已。因此可以将实现Runnable接口和实现Callable接口归为一种方式。这种方式与继承Thread方式之间的主要差别如下。
1.采用实现Runnable、Callable接口的方式创建多线程的优缺点:
优势:
(1)线程类只是实现了Runnable接口与Callable接口,还可以继承其他类。
(2)在这种方式下,多个线程可以共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势:编程稍稍复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。
2.采用继承Thread类的方法创建多线程的优缺点:
劣势:因为线程类已经继承了Thread类,所以不能再继承其他父类。
优势:编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。
总结
鉴于上面分析,因此一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值