java中创建线程的方式和区别

Thread

继承Thread类,需要覆盖方法 run()方法,在创建Thread类的子类时需要重写 run()。

class Mythread extends Thread{
    
    public void run(){
        //业务代码
    }
}

public static void main(String[] args){
     new Mythread().start();
}

缺点:java类的继承是单一的,extends后面只能指定一个父类。

Runnable

如果要实现多继承可以使用接口的方式,Java 提供了接口 java.lang.Runnable 来解决上边的问题。

Runnable是可以共享数据的,多个Thread可以同时加载一个Runnable(可以比作线程执行的任务),当各自Thread获得CPU时间片的时候开始运行RunnableRunnable里面的资源是被共享的,所以使用Runnable更加的灵活。

class Mythread2 implements Runnable{
    
    public void run(){
        //业务代码
    }
}

public static void main(String[] args){
    Mythread2 work = new Mythread2();
    new Mythread(work).start();
    new Mythread(work).start();
}

Callable

Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望任务在完成的能返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的参数类型表示的是从方法call()(不是run())中返回的值。

class Mythread3 implements Callable<Integer>{
    
    public Integer call() throw Exception{
        //业务代码
        int rt = 0;
        return rt;
    }
}

public static void main(String[] args){
    Mythread3 thread = new Mythread3();
    FutureTask<Integer> task = new FutureTask<>(thread);
    new Mythread(task).start();
    try{
         System.out.println("线程返回值:" + task.get());
    }catch(Exception e){
        e.printStackTrace();
    }
}

总结

实现Runnable接口相比继承Thread类有如下优势:

  1. 可以避免由于Java的单继承特性而带来的局限;
  2. 增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;
  3. 适合多个相同程序代码的线程区处理同一资源的情况。

实现Runnable接口和实现Callable接口的区别:

  1. Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
  2. Callable规定的方法是call(),Runnable规定的方法是run()
  3. Callable的任务执行后可返回值,而Runnable的任务是不能返回值(是void)
  4. call方法可以抛出异常,run方法不可以
  5. 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
  6. 加入线程池运行,Runnable使用ExecutorService的execute方法,Callable使用submit方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值