多线程的引入:
# 1、什么是线程:
- 线程是程序执行的一条路径,一个进程中可以包含多条线程
- 多线程并发执行可以提高程序的效率,可以同时完成多项工作
# 2、多线程的应用场景:
- 迅雷开启多条线程一起下载
- QQ同时和多个人一起视频
- 服务器同时处理多个客户端的请求
多线程并行和并发的区别:
- 1、并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行(需要多核CPU)
- 2、并发是指两个任务都请求运行,而处理器只能接受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行
- 比如我跟两个网友聊天,左手操作一台电脑和甲聊,同时右手用另一台电脑和乙聊,这就叫并行
- 如果用一台电脑,给甲发消息,再立刻给乙发消息,再给甲发,再给乙发...,这就叫并发
Java程序运行原理和JVM的启动是多线程吗?
Java程序运行原理:
Java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程,该进程会自动启动一个“主线程”,然后主线程去调用某个类的main方法。
JVM的启动是多线程吗?
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
多线程的实现方式:
1、继承Thread类:
- 定义类继承Thread
- 重写run()方法
- 把新线程要做的事写在run()方法中
- 创建线程对象
- 开启新线程.start(),内部会自动执行run()方法
2、实现Runnable接口:
- 定义类实现Runnable接口
- 实现run()方法
- 把新线程要做的事写在run()方法中
- 创建自定义的Runnable的子类对象
- 创建Thread对象,传入Runnable的子类对象
- 调用start()开启新线程,内部会自动调用Runnable的run()方法
两种方式的区别:
A、继承Thread类:
好处是:可以直接使用Thread类中的方法,代码简单
弊端是:如果已经有了父类,就不能用这种方法
B、实现Runnable接口:
好处是:接口可以多实现
弊端是:不能直接使用Thread中的方法,需要先获取到线程对象后,才能使用Thread的方法,代码复杂
sleep()方法和wait()方法的区别:
1、 sleep()方法必须传入参数,参数就是时间,时间到了自动醒来
wait()方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
2、 sleep()在同步函数或同步代码块中,不释放锁,睡着了也抱着锁睡
wait()方法在同步函数或同步代码块中,释放锁