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基础知识盘点- 线程篇的主要内容,如果未能解决你的问题,请参考以下文章
学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#