------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、
1. 进程
进程是应用程序在运行时期,所占用的内存空间
2. 线程
对CPU的一条独立的执行路径,独立的,分别被CPU执行
看成是一个大的应用程序中的小程序
好处,充分利用CPU的资源
3. 创建线程第一种方式
线程也是对象,线程对象的描述类 java.lang.Thread
l 定义类,继承Thread类
l 子类重写Thread类的run方法
l 建立Thread子类对象
l 调用子类对象中的方法start()开启线程
4. 多线程的随机性
程序两个执行路径,一个执行main 另一个执行线程方法run,CPU自己选择执行哪一个路径,线程的随机性
JVM本身是单线程程序还是多线程程序--多线程程序
5. 状态图--必须自己会画
6. 获取设置线程的名字
Thread-0编号来命名
Thread类方法,返回String getName()线程的名字
不是Thread子类中,获取线程名字
Thread类的静态方法 static Thread currentThread(); 返回当前运行的线程对象
设置名字:方法setName(String s)
构造方法Thread(String name);
修改线程名字一般情况下意义不大
7. 多线程的案例
引出来线程创建的第二种方式
多线程操作共享数据的安全隐患
多线程模拟售票,设定车票100张,4个窗口一起销售
发现每一个窗口自己卖自己的,不是共享数据,保证多个窗口出售的必须是共享的票源,可以使用静态修饰,引出创建线程的第二种方式
8. 创建线程的第二种方式
l 定义类实现Runnable接口
l 重写接口中的方法run
l 创建Thread类对象,传递Runnable接口的实现类对象
l 调用Thread类的方法start()开启线程
两种创建线程的区别在哪里
A 单继承,局限性,多实现避免了单继承局限性
B 继承方式,数据每个线程独享,实现接口方式,数据所有线程共享
9. 线程安全隐患
多线程同时操作共享数据,出现安全隐患
解决办法:一个线程操作共享数据没有操作完成,其他线程不能操作
同步技术:保证共享数据只有一个线程在操作。
同步代码块 格式:
synchronized(任意对象){
线程操作的共享数据
}
任意对象:对象监视器,对象锁。
同步原理,线程进入同步代码块执行后,获取到了监视器,锁,没有锁的线程挡在同步以外,在同步中的线程执行完毕后,释放了这个锁,其他线程才可以进来执行
加上同步后,数据安全了,但是运行效率下降,在安全和速度的选择上,重点选择安全性
10. 多线程模拟存钱效果 -- 方法的同步
储户去银行存钱 两个窗口,每个存3次,每次存100元
存钱的方法是银行,储户建立银行对象,调用银行的存钱方法
发现add方法中,所有的程序都是线程的共享数据,可以不可以同步这个方法呢
以后,如果方法中的全部代码,都是线程的共享数据,可以同步整个方法,没有必要写同步代码块.
l 同步方法中的this就是锁
l 静态方法中的锁,是本类的class文件对象,数据类型.class静态成员变量,返回这个类的class文件对象 , 类名.class就可以了
11. 单例设计模式Single
设计思想,保证对象的唯一性 class A{} new A() new A()
建立对象,调用类的构造方法,类私有了构造方法
实现步骤:
l 私有构造方法
l 成员位置创建自己的本类对象
l 提供公共方法,返回创建的对象
多线程并发访问懒汉式的方法getInstance()获取对象,输出对象,哈希值不是唯一
采用判断if两层,加上同步,保证了程序的安全性和执行效率,这个案例必须会写!
12. 死锁
程序出现的一种假死现象,多线程争抢同一把锁,造成的程序假死现象。在实际的项目中不会出现,但是面试中出现的,死锁现象出现在同步代码块的嵌套形式。考察目的是看程序人员对同步的原理是否理解。
13. wait sleep 方法区别
sleep 方法是Thread类的
wait 方法是Object类
sleep 不放锁
wait 放锁,唤醒后,重新获取锁才能运行
15. JDK5新特性,锁 java.util.concurrent.locks;
接口Lock,lock() unlock() 替代了 synchronized同步操作。锁定操作更加的灵活广泛。
使用实现类 ReentrantLock.
接口Condition,替代了Object类的方法 wait notify notifyAll
await signal signalAll
在接口Lock中,有一个方法 newCondition()返回了,Condition接口的实现类对象
16. 停止线程运行的方式
Thread类方法Stop不用
结束线程的根本是结束run方法
l 将循环变量设置为,可更改
l 异常停止 Thread类的方法 interrupt()中断线程
二、
1. 多线程的其他方法--toString()
返回线程的字符串表现形式,线程名字,优先级,线程组
优先级,分成三个级别 最大,默认,最小
setPriority(int num) 参考Thread类的静态常量
2. 守护线程 setDaemon
方法中传递布尔值,如果是true,这个线程是守护线程
圣斗士星矢 就是 智慧女神雅典娜(Athena)的守护线程
3. 定时器
可以让程序,定时运行,间隔一定的时间(毫秒)
java.util.Timer类,构造方法中,不要设置为守护线程
4. join方法
等待该线程终止,执行join的方法,的线程,会全部优先执行完毕,剩余的线程,争夺CPU的资源
5. static yield
线程的让步,执行到这个线程的yield方法的时候,将CPU的执行权让给别的线程来执行。