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差不多。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 在win10安装pip

    在win10安装pip

  • 注册会计师_会计师报考需要什么条件

    注册会计师_会计师报考需要什么条件本人是华政的,学的是国际法,成绩一般,从来没有上课的习惯。会计是零基础,6个月通过了注册会计师的会计、财务成本管理、税法、经济法、公司战略与风险管理5门课,想在这里和大家分享一下经验,也希望大家指教~~资料下载:http://www.iliyu.com/ 里面几乎什么资料都下的到          http://www.zhukuai.com/ 这个论坛8错          ht

  • Netty框架学习及第一个Netty应用「建议收藏」

    1.什么是Netty?  Netty是一个利用Java的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的API的客户端/服务器框架。Netty提供高性能和可扩展性,让你可以自由地专注于你真正感兴趣的东西。2.发展历史:  网络发展初期,花费很多时间学习socket的复杂、寻址等,在Csocket库上进行编码,并需要在不同的操作系统上做不同的处理。  Java早期…

  • matlab interp1 c,SciPy interp1d结果与MatLab interp1不同[通俗易懂]

    matlab interp1 c,SciPy interp1d结果与MatLab interp1不同[通俗易懂]我正在将一个MatLab程序转换为Python,我很难理解为什么scipy.interpolate.interp1d给出的结果与MatlabInterp1不同。在MatLab中,用法略有不同:yi=interp1(x,Y,xi,’cubic’)剪刀:f=interp1d(x,Y,kind=’cubic’)yi=f(xi)对于一个简单的例子,结果是相同的:MatLab软件:interp1…

  • Zookeeper-Zab协议

    Zookeeper-Zab协议Zookeeper消息广播模式崩溃恢复机制选LeaderZAB协议用来保持数据一致性,主要有两种模式,第一是消息广播模式;第二是崩溃恢复模式除此之外我门还应该了解Leader的选出机制消息广播模式在zookeeper集群中数据副本的传递策略就是采用消息广播模式。ZAB协议中Leader等待follower的ACK反馈是指”只要半数以上的follower成功反馈即可,不需要收到全部follower反馈”;下图中展示了消息广播的具体流程图:zookeeper中消息广播的具体步骤如下:客户端发起一

  • 浅谈大数据的标签管理

    浅谈大数据的标签管理最近参与了一个大数据的项目,是涉及标签管理方面的内容,使我这个初涉入大数据领域的人获益匪浅。标签,也可以叫做Tag,最早出现于2005年(注1),随着Web2.0的Blog应用被广泛使用开来。标签也可以说是一种关键词标记,可以更好的显示和突出搜索的关键词条,以便进行更好的索引和浏览查找。但标签又不同于平常的关键词,它可以使用文章或日志中根本没有出现过的词条来标记。比如一篇关于产品方面的文章,通篇…

发表回复

您的电子邮箱地址不会被公开。

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