多线程学习:
1.什么是进程,什么是线程
进程是一个应用程序
线程是一个进程的执行场景/执行单元
一个进程可以启动多个线程
2.对于java程序来说,在DOS命令窗口输入java HelloWorld之后:
先启动JVM,JVM就是一个进程,JVM再启动主线程调用main方法,同时启动一个垃圾回收线程负责看护,回收垃圾。最起码,现在的java程序中有两个线程并发
3.进程和线程的关系
进程可以看成公司
线程是公司的员工
进程A和B的内存独立不共享
线程A与线程B:
在java语言中:
线程A与线程B,堆方法区内存共享
但是栈内存独立,一个线程一个栈
4.单核计算机并不能做到真正的线程并发
切换线程非常快,给人类的感觉就是并发的
5.实现线程并发的两种方法
5.1:
第一种方法
类接触Runnable方法,然后重写run方法
在main方法创建Thread对象,传入类的对象,将其封装成Thread对象,再调用start方法
![](https://i-blog.csdnimg.cn/blog_migrate/4d7052664fe180641c96c5115d6a0f9f.png)
5.2:
第二种方法:
类继承Thread类,重写run方法,再main方法中创建类的对象,调用start方法
![](https://i-blog.csdnimg.cn/blog_migrate/961ba06f9703251a15400fb7e8d6cba5.png)
6.Thread的一部分基础方法:
中断线程推荐使用设置blod值的方法,可以保存数据
![](https://i-blog.csdnimg.cn/blog_migrate/51f81299c20e14e9c6617563f1fb7083.png)
7.线程调度:
抢占式调度模型:
优先级高的抢占的时间片多,java使用这种
最低优先级:1
默认优先级:5
最高优先级:10
均分式调度模型:
平均分配,每个线程的时间片一样长
java提供的线程调度方法:
实例方法:
void setPriority(int newPriority) 设置线程的优先级
int getPriority()
获取线程优先级
静态方法:
static void yield() 让位方法:暂停当前正在执行的线程对象,并执行其他线程
yield()不是阻塞方法,执行此方法只会让线程从运行态变为就绪态
8.多线程并发的环境下数据的安全
8.1 存在安全问题的条件
多线程并发,有共享数据,关系数据存在修改的行为
8.2 解决
线程排队执行,不能并发,这种机制叫线程同步机制
会牺牲一部分效率
异步编程模型:多线程并发
同步编程模型:线程同步
![](https://i-blog.csdnimg.cn/blog_migrate/75ffacffdead973f48b116da37bccd5a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5b57522d3ccb792e4cad4338e66dfb47.png)
![](https://i-blog.csdnimg.cn/blog_migrate/398b2024af7e5b967353e611e2918980.png)
9.守护线程
守护线程当所有用户线程结束时自动结束,比如立即回收线程
![](https://i-blog.csdnimg.cn/blog_migrate/719a7b121af90e5492fa75daf71761a8.png)
10.计时器
Timer timer=new Timer()
是创建一个计时器对象,传入参数ture表示是守护线程计时器
![](https://i-blog.csdnimg.cn/blog_migrate/26886b8697c023ed1448dfd06b93db68.png)
11.第三种实现线程的方式
实现Callable接口
里面的call方法相当于run方法
可以获取线程返回值
12.wait与notify
wait:使对象上的线程进入无限期等待,并且立即放弃抓住的锁
notify:唤醒正在对象上等待的线程
niotifyall:唤醒对象上等待的所有线程
![](https://i-blog.csdnimg.cn/blog_migrate/8578c491df9ee116f095427d577960e1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e089609a7d3f581557b86329509e520c.png)