【java开发多线程篇】之多线程的实现方式、生命周期和同步方法

157 阅读3分钟

前言: 多线程的知识点很多,也是面试必考点,必须要懂得如何运用,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...

一、实现多线程的方式有哪些?

Java多线程实现方式主要有四种:
1、继承Thread类,Java单继承,不推荐;
2、实现Runnable接口,Thread类也是继承Runnable接口,推荐;
3、实现Callable接口:实现Callable接口,配合FutureTask使用,有返回值;
4、使用ExecutorService、Callable、Future实现有返回结果的多线程。
其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。

实现多线程代码例子,上图...



二、线程生命周期:

新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态

三、线程同步方法:

1.同步方法synchronized 2.同步代码块synchronized

/**
* 用同步方法实现
* 
* @param money
*/
public synchronized void save(int money) {
    account += money;
}
/**
* 用同步代码块实现
* 
* @param money
*/
public void save1(int money) {
    synchronized (this) {
    ccount += money;
    }
}

四、wait(),notify()主要用在哪里?

wait( ),notify( ),notifyAll( )都不属于Thread类,而是属于Object基础类,也就是每个对象都有wait( ),notify( ),notifyAll( ) 的功能,因为每个对象都有锁,锁是每个对象的基础,当然操作锁的方法也是最基础了。
wait/notify必须结合synchronized来使用,即在synchronized内部使用

面试的时候问到,wait和notify你是怎么使用的?

答:
在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作。
重点:
在缓存区存储需要的数据,然后执行线程的时候如果没数据就wait,不执行了,有的话就notify唤醒

对于sleep()方法,我们首先要知道该方法是属于Thread类中的
sleep()和wait()都是用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁
sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interrupt()方法唤醒

五、Thread 类中的start() 和 run() 方法有什么区别?

start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。
而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行

多线程最终都是通过start()方法进行启动


结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)