Java基础知识盘点- 线程篇

Posted Cristin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础知识盘点- 线程篇相关的知识,希望对你有一定的参考价值。

创建线程的方式及实现

  一、继承Thread类创建线程类

    1、定义Thread的子类,并重写run方法,因为该方法的方法体就是代表了线程要完成的任务,因此run方法又叫做执行体。

    2、创建Thread子类的实例,即创建了线程对象。

    3、调用线程对象的start方法来启动该线程。

  二、通过Runnable接口来创建线程类

    1、定义Runnable接口的实现类,并重写run方法,跟Thread一样,该run方法又叫做执行体。

    2、创建实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的对象。

    3、调用线程对象的start方法来启动该线程。

  三、通过Callable和Future创建线程

    1、创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

    2、创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

    3、使用FutureTask对象作为Thread对象的target创建并启动新线程。

    4、调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

  创建线程的三种方式的对比

    采用实现Runnable、Callable接口的方式创见多线程时

    优势是:

      线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

      在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

    劣势是:

      编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

    使用继承Thread类的方式创建多线程时优势是:

      编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

    劣势是:

      线程类已经继承了Thread类,所以不能再继承其他父类。

 

sleep()、join()、yield()区别

  1、sleep()

    在指定毫秒数为单位,让当前正在执行的线程处于休眠状态,但此操作并不会释放对象锁。

  2、yield()

    它与sleep类型,也不会释放锁,但它没有参数,即yield()方法只是使当前线程重新回到可执行状态。该方法只能使同优先级或高优先级的线程得到执行机会,这也和sleep方法不同。 

  3、join()

    Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

 

sleep()和wait()的区别

  1、对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的

  2、sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态

  3、在调用sleep()方法的过程中,线程不会释放对象锁

  4、而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

以上是关于Java基础知识盘点- 线程篇的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# Java 并发 - 线程基础

学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

#yyds干货盘点#2021年度Java并发编程面试真题&高频知识点汇总

Gradle+Groovy基础篇#yyds干货盘点#

从源码理解Java线程池(简介篇)

学习Java必备的基础知识打卡12.19,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#