Java线程学习-Runnable接口

120 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

前言

兄弟们,见过周六年会但是加班到晚上11点的吗?一天都没有玩儿,在跟测试确认n多个bug!!!但是每天的学习不能落下,今天继续学线程相关知识:Runnable接口的引入以及策略模式在Thread中的使用

Runnable的职责

Runnable接口非常简单,只定义了一个无参数无返回值的run方法,具体代码如下:

package java.lang;
public interface Runnable{
    void run();
}

创建线程的方式就是Thread类,严谨一些的说法是实现线程的执行单元有两种方法:

  • 可以通过继承Thread这个类然后重写run方法实现自己的业务逻辑
  • 可以实现Runnable接口实现自己的业务逻辑(实现Runnable接口中的run方法,并且将Runnable实例用作构造Thread的参数) 代码如下:
@Override 
public void run(){ 
    //如果构造Thread时传递了Runnable,则会执行runnable的run方法
    if(target != null){ 
        target.run(); 
    } 
    //否则需要重写Thread类的run方法
}

策略模式在Thread中的使用

前面说过无论是Runnable方法的run方法,还是Thread类本身的run方法(事实上Thread类也实现了Runnable接口),都是想将线程的控制本身和业务逻辑的运行分离开,达到职责分明、功能单一的原则,这一点与GOF设计模式中的策略设计模式很相似。
重写Thread类的run方法和实现Runnable接口的run方法还有一个很重要的不同,那就是Thread类的run方法是不能共享的,也就是说A线程不能把B线程的run方法当做自己的执行单元,而使用Runnable接口则很容易就能实现这一点:使用同一个Runnable的实例构造不同的Thread实例。

总结

以上学习了什么是线程,以及初步掌握了如何创建一个线程,并且通过重写Thread的run方法和实现Runnable接口的run方法进而实现线程的执行单元。但是最重要的还是理解线程的生命周期,只有清晰地掌握生命周期各个阶段的切换,才能更好地理解线程的阻塞及唤醒机制,同时为同步锁等概念打下基础。明天继续~