luogg_java学习_12_线程
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
**转载请注明 出自 : luogg的博客园 ** 谢谢配合!
线程
程序、进程、线程的概念
- 程序:我们用程序设计语言编写的静态代码
- 进程:进程是程序的一次执行,是动态的概念,每个程序载入内存中运行就产生一个进程,进程独占系统资源,所谓的多进程指的是可以有多个程序同时执行
- 线程:线程是比进程更小的执行单位,一个程序中运行的多个任务,多个线程共享所在进程的资源(一个进程可以包含一个或多个线程,一个进程至少要包含一个线程,例如:主线程 main)。
例如:
我们每个人就是一个多线程的对象,想想看,我们可以边吃饭边看电视,同时还要呼吸、心跳等,在同一时间内可以做几件事情,
线程的两种创建方式
- 继承Thread类
- 创建类继承 Thread 类
- 复写 run 方法(想要同时执行代码)
- 激活线程类或启动线程类 start()
- 实现Runnable接口
- 创建类实现 Runnable 接口
- 复写 run 方法(想要同时执行代码)
- 激活线程类或启动线程类 start()
线程的两种创建方式对比
继承: 继承的同时默认的也实现了Runnable接口
实现的方式优于继承的方式 , 1, 避免了单继承的局限性 2, 如果多个线程要操作同一份数据(或资源), 更适合用实现的方式
线程的常用方法
start();新建的线程进入runnable状态
sleep();
run();
getName();获取线程名称
setName();
currentThread()调取当前线程
join(); 在a线程中调用B线程的join方法
isAlive
getPriority() 获取线程优先级 默认5 1,10
setPriority
Object中的方法
wait 等待
notify 通知,用于线程通信
notifyAll 通知所有线程
使用多线程优点
1, 提高应用程序的响应
2, 提高计算机cpu的利用率
3, 改善程序结构
线程的生命周期
1,新建 new
2,就绪 start
3,运行
4,阻塞
5,死亡
线程的安全问题
由于一个线程在操作共享数据过程中, 未执行完的情况下, 另外的线程参数进来, 导致了共享数据存在了安全问题
如何解决线程的安全问题
必须让一个线程操作共享数据完了之后,其他线程才有机会参与线程数据共享
java实现线程的安全
1,同步代码块
慎用tihs原因: 继承时候有多个对象,不知道this指哪个
同步监视器可以写this(当前对象), 也可以写static Object obj = new Object();中的obj
2,同步方法
类本身充当锁: 类名.class
同步方法的锁是tihs(默认了),当继承线程时,会创建多个对象, 用同步方法也会出错
同步和死锁
案例:“银行取款问题”,银行账户,可以办卡,可以办存折, 假设,现在两人同时通过存折或者是卡取钱,卡里有500,甲拿卡取500,乙拿着存折也要取500
同步:某一个对象占用CPU资源的时候,其他对象不能抢占CPU的资源,必须等当前对象使用完该资源的时候才能使用CPU资源
异步:就是线程的默认状态,所有对象都可以随时抢占CPU的资源。
实现同步的方式:
1、把需要同步的代码用 synchronized(对象) {} 语句块绑定
2、把需要同步的代码放到方法中,并且用 synchronized 关键字声明,然后再在 run 方法中调用
死锁
过多的同步就有可能导致死锁
线程不同的弊端:
由于一个时间只能有一个线程访问共享数据, 效率变低了