大家好,我是阿七。
这是以前的学习笔记,阿七把它整理了一下分享给大家,主要涉及以下5个知识点,感兴趣的小伙伴可以看看。
- 实现多线程的两种方法及源码分析
- 线程的生命周期及相关方法
- synchronized关键字
- volatile关键字
- Java内存模型
一、实现多线程的两种方法及源码分析
官方文档说明,实现多线程的方法有且仅有两种,其他实现方式底层说白了还是属于这两种,所以,以后面试官再问你这个问题,可以直接怼上去了哈哈。1、继承Thread类
public class ThreadStyle extends Thread{ @Override public void run() { System.out.println("用Thread类实现线程"); } public static void main(String[] args) { new ThreadStyle().start(); }}
2、实现Runnable接口
public class RunnableStyle implements Runnable{ public static void main(String[] args) { Thread thread = new Thread(new RunnableStyle()); thread.start(); } @Override public void run() { System.out.println("用Runnable方法实现线程"); }}
在上面的代码中,我们看到了start()和run()方法,二者区别在于:
run():只是一个普通方法,单独调用run()不会启动线程
start():启动新线程并告知jvm可以来运行该线程
3、start()源码分析
我们可以通过源码知道start()执行的顺序是:
1、启动新线程检查线程状态(必须是未启动的才可以)
2、加入线程组
3、调用start0()
注意:
1、start()是被synchronized修饰的,可以保证线程安全;
2、由jvm创建的main方法线程和system组线程,并不是通过start()方法启动;
3、不能两次调用start()方法,否则会报IllegalThreadStateException异常;
二、线程的生命周期
1、线程的6种状态
New:创建还未启动
Runnable:调用start()后,(可运行的)或者(在运行的),要等待CPU时间片来运行
Blocked:当一个线程进入到被synchronized关键字修饰的方法(代码块)时,且该锁已经被其他线程拿走,此时线程状态就是
Waitin