Java基础之线程篇
一:线程的生命周期
线程的生命周期包括 新建--就绪--运行--阻塞--死亡,它们之间相互切换的方式如下:

二:创建多线程的方式(4种方式)
方式一:继承Thread类

方式二:实现Runnable接口

方式三:实现Callable接口 -----JDK 5.0 新增



方式四:使用线程池的方式

流程:(NumberThread 是实现Runnable 或 Callable 接口的实现类)

三:线程的同步 (解决安全问题)
什么是线程的安全问题?
- 多个线程执行的不确定性引起执行结果的不稳定
- 多个线程对同一块内存空间的共享,会造成操作的不完整性,破坏数据。(如多个线程同时对一个数据进行操作)
例子:创建三个窗口卖票,一共100张票。
1.问题:卖票过程中,出现了重票,错票------>出现了线程安全问题(有共享数据,才可能会有线程安全问题)。
2.问题出现的原因:当某个线程操作车票的过程中,尚未完成操作,其他进程这时也参与进来操作车票。
3.如何解决:当一个线程在操作车票的过程中,其他进程不能参与进来,直到当前进程操作完为止。
4.在java中,通过同步机制来解决线程安全问题。有3种方式:
第一种:



第二种:


如果某个线程正在运行同步代码块中的代码时(也就是synchronized中的代码),其他线程是不能访问这段代码的,相当于加上了一把锁,只有当这段代码块执行完毕,其他线程才有机会进入该段代码。
第三种:Lock锁 -----JDK 5.0 新增
同步过程如下:
(1)ReentrantLock lock = new ReentrantLock(); //实例化ReentrantLock
(2)lock.lock(); //调用lock方法进行锁定,这之后的代码就相当于加上了锁,只有当前线程能访问。
(3)lock.unlock(); //调用unlock方法进行解锁。

注意:同步的方式,虽然解决了线程的安全问题,但操作同步代码块时,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低(但线程的安全问题只能这么解决)。
四:线程的死锁问题

五:线程的通信(涉及的三个方法:wait(),notify(),notifyAll())


本文参考自尚硅谷Java教程视频:https://www.bilibili.com/video/BV1Kb411W75N?p=446&spm_id_from=pageDriver
浙公网安备 33010602011771号