**java多线程(5.0)**
1.使用多线程的原因:目前操作系统都是多任务、多线程的,即操作系统能够同时执行多个任务。
#1.进程:是一个应用程序(一个进程就是一个软件)。进程可以看做现实生活的公司
2…#2…线程:是一个进程中执行的场景/执行单元。线程看做公司中某个员工
2.一个垃圾回收线程负责看护,回收垃圾。
最起码,现在的java程序至少有两个线程并发。
一个是垃圾回收线程(JVM),一个是main方法执行的主线程。
例子:
阿里巴巴(进程)
马云:阿里巴巴的一个线程,
董文红:阿里巴巴的一个线程
3**.使用了多线程机制后,main方法结束,main方法结束只是结束主线程,主栈空了,其它栈的线程还可能在**
压栈弹栈
5.多线程的run方法和start方法区别:
#1.run():方法在分支栈的底部,main方法在主栈的栈底部。run和main是平级的。
该方法不会启动线程,不会分配新的分支栈。(单线程)
#2.start();方法的作用:启动一个分支线程,在JVM中开辟一个新的栈空间,执行完毕后,代码立即结束。
启动成功的线程会自动调用run方法,用run方法在分支栈底部(压栈);
#3.程序的输出结果特点:
@1.有先有后
@2.有多又少
原因:某线程抢到了线程的执行权。
6.实现线程的两种方法:
#1.编写一个类,直接继承java .lang.Thread ,重写run方法;
#2.编写一个类,实现java.lang.Runnable接口,实现run方法.(**java是面向接口编程,建议使用接口这种方式写。)**注意:更灵活,因为一个类继承了接口,还可以去继承其它的类。
6.1标题run()和start区别:
- 多线程并发(两个线程抢执行线程权,并执行线程。)
7.多线程的生命周期:
8 线程安全(重要)
#1.程序运行在服务器中,更关注的是线程的安全问题。
2.怎么解决线程安全问题:线程排队执行。
#1.异步线程模型:线程t1 线程t2 ,各自执行各自,t1不管t2,t2不管t1.(并发)
#2.同步线程:线程t1等待t2执行后再执行(排队)
8.同步机制:
共享对象是需要排队,括号外的线程不用排队。
synchronized (共享对象) {
}
9.什么时候数据在多线程并发环境下存在安全问题?
三个条件:(满足三个条件)
条件一:多线程并发
条件二:有共享数据
条件三:共享数据有修改行为。
10.java中有三大变量存储位置:
(成员变量)实例变量:在堆中
静态变量:在方法区
局部变量:在栈中
#1.以上三大变量:局部变量永远不可能存在线程安全问题,局部变量不共享(一个线程一个栈)
局部变量在栈中,所以说局部变量永远不会共享。
#2.实例变量在堆中,堆中只有一个,
#3.静态变量在方法区中,方法区中只有一个堆和方法区是多线程共享的,所以可能存在线程安全问题。
11**.synchronizeed的三种用法**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-meXM7RDf-1610351309510)(D:&& Typora 代码编译工具@@@@Typora图片2\synchronized关于线程问题.png)]
第三种:在静态方法上使用synochronized
#1.表示找类锁
类锁只有一把,就算创建了100个对象,那类锁也只有一把
对象锁:一个对象一把锁 ,100个对象100把锁,
类锁:100个对象,也可能只是一把锁。
12.死锁
程序不出现异常,也不会出错,程序一直在那僵持。
synchronized在开发中尽量不要嵌套使用。容易导致死锁现象
synchronized (s1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2){
}
}
#1.守护线程()----->setDaemon(true);
用户线程结束,守护线程也结束。
#2.定时线程:
间隔特定的时间,执行特定的程序。
@1.sleep()方法,设置睡眠时间,执行最原始的定时器。
@2.java类库中写好的定时器,java.util.Timer,可以直接使用。
@3.在实际开发中,目前使用较多是Spring框架中提供的Spring框架,这个框架只要进行简单的配置,就可以完成定时器任务。
13.关于object类中的wait和notify方法(生产者和消费者模式)
- 欢迎大家点赞评论