Runnable和Callable区别[通俗易懂]

RunnableRunnable是一个接口,该接口中只有一个run方法,实现Runnable接口的类需要重写run方法,然后可以把这个类作为Thread类的一个参数,来创建线程,具体的用法有两种:创建一个类,实现Runnable接口,重写run方法classMyThreadimplementsRunnable{@Overridepublicvoidrun(){System.out.println(“MyThread”);}}使

大家好,又见面了,我是你们的朋友全栈君。

Runnable

Runnable是一个接口,该接口中只有一个run方法,实现Runnable接口的类需要重写run方法,然后可以把这个类作为Thread类的一个参数,来创建线程,具体的用法有两种:

  • 创建一个类,实现Runnable接口,重写run方法
class MyThread implements Runnable { 
   
    @Override
    public void run() { 
   
        System.out.println("My Thread");
    }
}
  • 使用匿名内部类创建一个对象
class Test{ 
   
    public static void main(String[] args) { 
   
        Runnable myThread = new Runnable() { 
   
            @Override
            public void run() { 
   
                System.out.println("My Thread");
            }
        };
    }
}    

Callable

Calllable同样也是一个接口,也是用来创建线程的,只不过略微有点区别,Callable中的是call方法,同样可以由一个类实现Callable接口,重写call方法,然后作为Thread的参数,只不过用法不同,call方法是带有返回值的,而且它创建出来的对象也不能直接作为Thread的参数,而是需要用FurtherTask类包裹起来,然后再传进去,call方法的返回值需要用的FurtherTask中的get方法来获取。用法如下:

class MyThread implements Callable<String> { 
   
    private int ticket = 10 ; // 一共10张票
    @Override
    public String call() throws Exception { 
   
        while(this.ticket>0){ 
   
            System.out.println("剩余票数:"+this.ticket -- );
        }
        return "票卖完了,下次吧。。。" ;
    }
}
public class Test{ 
   
    public static void main(String[] args) throws Exception { 
   
        FutureTask<String> task = new FutureTask<>(new MyThread()) ;
        new Thread(task).start();
        System.out.println(task.get());
    }
}    

两者的区别

相同点

  • 两者都是接口;
  • 两者都可用来编写多线程程序;
  • 两者都需要调用Thread.start()启动线程;

不同点

  • 两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
  • Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;

特殊:使用FutureTask的get方法时会让主线程进入阻塞状态,因为它要确保call方法已经执行完毕,要结果出来之后才会唤醒主进程。不调用get方法就不会阻塞,也就说Callable如果不调用get方法,效果就和Runnable差不多。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126152.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA HD japan_E3X-HD光纤放大器_欧姆龙继电器_欧姆龙PLC_欧姆龙接近开关「建议收藏」

    JAVA HD japan_E3X-HD光纤放大器_欧姆龙继电器_欧姆龙PLC_欧姆龙接近开关「建议收藏」欧姆龙E3X-HD光纤放大器特点免维护免维护,长期稳定检测【智能功率控制】针对LED常年老化造成的投光量降低及脏污等导致的受光量降低现象,通过智能功率控制功能,自动感知并保持最佳检测状态。环境适应性强,免维护。想要检测各种颜色,大小的工件在所有检测场合中游刃有余搭载发光元件GIGARAYⅡE3X-HD特点6同级最高水准的GIGARAYII的压倒性大功率,黑橡胶等低反射率检测及大型被检测…

    2022年7月7日
    31
  • CPU核数和load average的关系「建议收藏」

    CPU核数和load average的关系「建议收藏」在前面的文章《Linux系统监控——top命令》中我简单提到了,判断loadaverage的数值到底大不大的判断依据,就是数值除以CPU核数,大于5,就说明超负荷运转了。——这里其实不太严谨今天这篇文章来仔细分析分析,CPU和loadaverage的关系。转载文章一我们知道判断一个系统的负载可以使用top,uptime等命令去查看,它分别记录了一分钟、五分钟、以及十五分钟的系统…

    2022年7月17日
    26
  • hql删除mysql语句_hibernate — HQL语句总结

    hql删除mysql语句_hibernate — HQL语句总结本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是HibernateQueryLanguage的缩写,是官方推荐的查询语言。QBC是QueryByCriteria的缩写,是Hibernate提供的一个查询接口。Hibernate是一个轻量级的框架,它允许使用原始SQL语句查询数据库。1.1HQL基础HQL是Hiberante官方推荐的…

    2022年6月24日
    32
  • Window.location.search和Window.location.hash区别[通俗易懂]

    Window.location.search和Window.location.hash区别[通俗易懂]search:只能取到“?”后面和“#”之前的内容,如果“#”之前没有“?”search取值为空hash:第一个”#”之后的内容

    2022年7月16日
    15
  • API之Byte类型

    API之Byte类型packagecom.wonders.week01;/***以JDK1.7为基础*(1)java.lang.Byte继承了java.lang.Number*(2)是final修饰的类*(3)构造方法:publicByte(bytevalue)*(4)构造方法:publicByte(Strings)throwsNumberFormatException里

    2022年6月18日
    29
  • Web Service简单入门示例

    Web Service简单入门示例

    2022年1月2日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号